C语言实现Columnar cipher转置缓冲区相关问题咨询
现有代码问题梳理
- 内层for循环语法和逻辑错误,
for(j=0,i<dim;j++;)的判断条件错误,应当判断j < dim scanf调用不符合当前场景需求,你已经将文件内容读取到输入缓冲区in中,无需调用scanf读取标准输入,直接通过下标访问in的字符即可- 转置矩阵下标越界,
transpositionmatrix[dim][dim]超出了数组有效访问范围(数组下标从0开始,有效范围为[0, dim-1]) - 矩阵类型定义不匹配,存储char类型的输入内容用
char类型矩阵更合理,避免类型转换问题
行列转置实现逻辑
列置换密码的转置操作核心逻辑分为两步:
- 按行把输入缓冲区的内容填充到
dim*dim的矩阵中,第i行第j列的元素对应输入缓冲区的in[i * dim + j] - 按列读取矩阵内容写入输出缓冲区,第j列第i行的元素写入输出缓冲区的
out[j * dim + i],即可完成行列互换
修正后的完整代码
int transpose_buffer(char *out, char *in, unsigned int dim) { // 定义dim阶char矩阵存储输入内容 char matrix[dim][dim]; unsigned int i, j; // 按行填充矩阵 for (i = 0; i < dim; i++) { for (j = 0; j < dim; j++) { matrix[i][j] = in[i * dim + j]; // 可选:若输入长度不足dim*dim,可补充填充字符,列置换密码常用填充符为'X' // if (in[i * dim + j] == '\0') matrix[i][j] = 'X'; } } // 按列读取完成转置,写入输出缓冲区 for (j = 0; j < dim; j++) { for (i = 0; i < dim; i++) { out[j * dim + i] = matrix[i][j]; } } // 可选:为输出缓冲区补充字符串结束符 out[dim * dim] = '\0'; return 0; }
补充说明
如果你需要实现带自定义置换顺序的列置换密码,只需要提前定义置换顺序数组,第二步按置换数组的下标读取对应列即可。你从文件读取内容时,只要保证输入缓冲区in内至少有dim*dim个有效字符,调用上述函数即可完成转置操作。
内容的提问来源于stack exchange,提问作者Maxwell Walker
相关产品推荐
相关产品推荐

