1

我有一项任务是创建一个块转置密码程序。用户将输入他们选择的短语,程序将去除短语的空格、标点符号并使其小写,然后读取其长度并创建一个二维数组,该数组的大小与最近的正方形大小相匹配,以适合所有变异字符串中的字符,并用随机字母填充剩余空间。

问题是,我在创建那个正方形时遇到了问题。

到目前为止我有这个:

int main()
{
    string input;
    cout << "Please enter message to cipher." << endl;
    getline(cin, input);

    /* do punctuation removal/mutation */

    int strLength = input.length(); //after mutation

    /* need to find the square here before applying sizes and values to arrays */

    char * original = new char[][]; // sizes pending
    char * transposed = new char[][]; // sizes pending

    for (int i = 0; i <= /* size pending */ ; i++)
    {
        for (int j = 0; j <= /* size pending */ ; j++)
        {
            transposed[j][i] = original[i][j];
        }
    }

    /* do more stuff here */
}

有任何想法吗?

(我已经完成了突变部分;使用备用代码进行了测试)

4

3 回答 3

2

你不能做例如

char * original = new char[][];

首先,您尝试创建一个数组数组(或指针的指针)并将其分配给单个指针。您需要分两步完成:

  1. 分配“外部”数组:

    char **original = new char* [size];
    
  2. 分配“内部”字符串:

    for (int i = 0; i < size; i++)
        original[i] = new char [other_size];
    

但是我强烈建议不要使用它!相反,您应该使用std::vector而不是在堆上分配的“数组”,如果内容是字符串,则使用std::string

std::vector< std::vector< std::string > > original;
于 2012-11-09T06:12:29.537 回答
0

我相信你不需要“新”来创建你的存储。以下代码应该可以完成这项工作:

char buf[size][size]; // size is a variable
... // populate your buf

char tmp;
for(int i = 0; i < size; i++) {
  for(int j = 0; j < i; j++) {
    tmp = buf[i][j];
    buf[i][j] = buf[j][i];
    buf[j][i] = tmp;
  }
}

这会在适当的位置进行转置。您不需要另一个数组来存储字符。

于 2012-11-09T07:16:50.517 回答
0

您可以取长度的平方根,向下舍入为整数,然后加一得到新的长度。

int len = (int)(sqrt(strLength) + 1e-9) + 1;

然后,您将像往常一样使用和填充malloc正方形。len

于 2012-11-09T05:33:59.310 回答