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

C语言二维char数组最后一列全为空字符^@,如何排查错误原因?

错误原因

  1. 行数计算逻辑完全颠倒:你判断是否需要补空白的条件写反了被除数和除数,应该用总长度length对每行字符数key取余,而不是key%length。当前写法仅在key<length时碰巧得到正确行数,只要key>=length逻辑完全错误。
  2. 矩阵填充循环边界错误:填充二维数组的外层循环写为row <= num_rows,数组下标从0开始,总行数为num_rows时只需循环row < num_rows。多出来的一次循环会读取全局数组inputData中超出有效长度的位置,这些位置的默认初始值就是你看到的空字符^@(ASCII 0)。
  3. 读入逻辑错误:你读入输入的循环用了i <= length,总长度为length的字符串只需读取0到length-1共length个字符,多读取的1个字符如果遇到EOF,会写入不可控的值到inputData[length]。同时你预填充的空格会被后续的读入逻辑完全覆盖,没有任何作用。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char inputData[500];

void encrypt(int key, int length) {
    char matrix[500][500];
    int row, coln;
    int num_rows;
    int blanks = 0;

    // 修正行数计算逻辑
    if (length % key == 0) {
        num_rows = length / key;
        blanks = 0;
    } else {
        num_rows = length / key + 1;
        blanks = 1;
    }

    // 修正循环边界,同时整合补空白逻辑
    for (row = 0; row < num_rows; row++) {
        for (coln = 0; coln < key; coln++) {
            int insert_index = row * key + coln;
            if (insert_index < length) {
                matrix[row][coln] = inputData[insert_index];
            } else {
                matrix[row][coln] = ' ';
            }
        }
    }

    // 按列打印
    for (coln = 0; coln < key; coln++) {
        for (row = 0; row < num_rows; row++) {
            printf("%c", matrix[row][coln]);
        }
    }
}

int main(int argc, char *argv[]) {
    if (argc < 4) {
        printf("参数不足\n");
        return 1;
    }
    int key = atoi(argv[2]);
    int length = atoi(argv[3]);
    if (key <=0 || length <=0 || length >=500) {
        printf("参数非法\n");
        return 1;
    }

    // 修正读入逻辑,只读length个字符,处理EOF情况
    for (int i = 0; i < length; i++) {
        int c = getc(stdin);
        inputData[i] = (c == EOF) ? ' ' : (char)c;
    }

    if (strcmp(argv[1], "-e") == 0) {
        encrypt(key, length);
    }
    // 原代码未提供decrypt实现,此处省略
    return 0;
}

补充说明

原代码中单独的补空白逻辑可以直接合并到填充循环中,逻辑更清晰,也避免了遗漏的边界情况。修正后不会再出现最后一列是空字符的问题。

内容的提问来源于stack exchange,提问作者gogo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:15:04