我有一个创建块转置密码程序的任务。用户将输入他们选择的短语,并且程序将在读取其长度并创建二维数组之前去除空格,标点符号和小写的短语,并创建适合所有的最近正方形的大小的二维数组。变异字符串中的字符,并用随机字母填充剩余空格。
问题是,我在创建这个方块时遇到了问题。
到目前为止,我有这个:
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 */
}
任何想法?
(我已经完成了突变部分;使用替代代码进行了测试)
答案 0 :(得分:2)
你不能这样做。
char * original = new char[][];
首先,您尝试创建一个数组数组(或指针指针)并将其分配给单个指针。您需要分两步完成:
分配“外部”数组:
char **original = new char* [size];
分配“内部”字符串:
for (int i = 0; i < size; i++)
original[i] = new char [other_size];
但是我强烈建议反对使用它!相反,您应该使用std::vector
而不是堆上分配的“数组”,如果内容是字符串,则使用std::string
:
std::vector< std::vector< std::string > > original;
答案 1 :(得分:0)
你可以取长度的平方根,向下舍入到整数,然后加一个得到新的长度。
int len = (int)(sqrt(strLength) + 1e-9) + 1;
然后使用malloc
len
使用{{1}}方格,并按照惯例填写。
答案 2 :(得分: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;
}
}
这就是转置到位。您不需要另一个数组来存储char。