C语言二维char数组最后一列全为空字符^@,如何排查错误原因?
错误原因
- 行数计算逻辑完全颠倒:你判断是否需要补空白的条件写反了被除数和除数,应该用总长度
length对每行字符数key取余,而不是key%length。当前写法仅在key<length时碰巧得到正确行数,只要key>=length逻辑完全错误。 - 矩阵填充循环边界错误:填充二维数组的外层循环写为
row <= num_rows,数组下标从0开始,总行数为num_rows时只需循环row < num_rows。多出来的一次循环会读取全局数组inputData中超出有效长度的位置,这些位置的默认初始值就是你看到的空字符^@(ASCII 0)。 - 读入逻辑错误:你读入输入的循环用了
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
相关产品推荐
相关产品推荐

