You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类型矩阵更合理,避免类型转换问题

行列转置实现逻辑

列置换密码的转置操作核心逻辑分为两步:

  1. 按行把输入缓冲区的内容填充到dim*dim的矩阵中,第i行第j列的元素对应输入缓冲区的in[i * dim + j]
  2. 按列读取矩阵内容写入输出缓冲区,第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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:15:05