C语言新手求助:二维数组扫描与打印结果异常问题
帮你排查C语言二维数组输入输出的坑
兄弟,刚学C碰到数组/指针的问题太正常了!我帮你捋捋大概率出问题的地方——扫描和打印环节都有可能踩坑,咱们一个个说:
扫描环节的常见错误
- 数组未初始化:如果你只是声明了二维数组但没给它赋初始值,那数组里全是内存里的随机垃圾值,哪怕你给部分坐标赋值了,未赋值的位置打印出来也是乱的。比如
int arr[st_objects][st_objects];这种,最好初始化一下(C99及以后支持变长数组用{0}初始化)。 - 坐标越界访问:你说st_objects是5的话,数组的下标范围是
0~4,如果输入的坐标是5或者负数,那就是越界操作了——这会破坏其他内存区域的数据,不仅数组值乱,甚至可能直接崩溃。一定要加个判断,确保输入的行、列在合法范围内。 - scanf格式/缓冲区问题:比如前面读st_objects的时候用了
scanf("%d", &st_objects);,缓冲区里留了个换行符,后面读坐标的时候可能会被当成空输入;或者格式符用错了(比如把整数的%d写成%f),导致读入的值完全不对。 - 指针误用(如果用了动态数组):要是你用
int **arr来实现二维数组,却没给每一行分配内存(比如没循环用malloc),那就是野指针,访问的时候肯定出问题。
打印环节的常见错误
- 循环范围错了:比如打印的时候循环从
1到st_objects,而不是0到st_objects-1,这样就会访问数组外面的内存,打印出垃圾值。 - 格式符不匹配:数组是int类型,你却用
%s或者%f来打印,那输出肯定是乱码。 - 行/列遍历顺序搞反:比如把外层循环的行和内层循环的列写反了,输出的数组行列就颠倒了,看起来像是完全错误。
给你个参考示例代码
你可以对照自己的代码看看哪里不一样:
#include <stdio.h> int main() { int st_objects; printf("请输入数组的宽高:"); scanf("%d", &st_objects); // 初始化数组为0,避免垃圾值干扰 int arr[st_objects][st_objects] = {0}; printf("请输入坐标和对应值(格式:行 列 值,输入-1 -1 0结束):\n"); int row, col, val; while (scanf("%d %d %d", &row, &col, &val) == 3) { if (row == -1 && col == -1) break; // 检查坐标合法性 if (row >= 0 && row < st_objects && col >= 0 && col < st_objects) { arr[row][col] = val; } else { printf("坐标超出范围啦!请输入0到%d之间的数\n", st_objects - 1); } } // 打印数组 printf("\n输出的二维数组:\n"); for (int i = 0; i < st_objects; i++) { for (int j = 0; j < st_objects; j++) { printf("%d\t", arr[i][j]); } printf("\n"); } return 0; }
你可以先检查自己的代码有没有上面说的这些问题,要是还是搞不定,可以把你的代码贴出来,我再帮你揪细节!
内容的提问来源于stack exchange,提问作者unf0rged
相关产品推荐
相关产品推荐

