C语言二维数组统计每行正数个数存一维数组出错求助
代码问题分析与修正
问题描述
需要创建n×n的二维数组A,由用户输入数值,再生成一维数组C[n],其中C[i]存储A第i行的正数个数。但现有代码运行后C的所有元素值相同,不符合预期。
原代码的核心错误
- const变量非法修改:一开始定义了
const int n=10;,后续又通过scanf("%d",&n);尝试修改const变量,这属于C语言中的未定义行为,会导致数组大小逻辑混乱。 - 正数计数逻辑错误:
suma仅初始化一次,累加了整个数组的正数总数,没有按行重置计数;且未将每行的正数个数存入c数组,最后输出时直接把总个数赋值给所有c[k],导致所有C元素值一致。 - 变长数组兼容性问题:用const变量作为数组大小,在C99之前的标准中不支持变长数组,部分编译器可能出现编译错误。
修正后的代码
#include <stdio.h> int main() { int n; printf("请输入行数和列数n="); scanf("%d", &n); // 定义数组(若编译器不支持变长数组,可改用动态内存分配) int a[n][n]; int c[n]; int i, j; // 输入二维数组元素,限制范围在[-1000, 1000] for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { do { printf("a[%d][%d]=", i, j); scanf("%d", &a[i][j]); } while (a[i][j] < -1000 || a[i][j] > 1000); } } // 按行统计正数个数并存入c数组 for (i = 0; i < n; i++) { int suma = 0; // 每行开始时重置计数 for (j = 0; j < n; j++) { if (a[i][j] > 0) { suma++; } } c[i] = suma; // 将当前行的正数个数存入c[i] } // 输出c数组 for (i = 0; i < n; i++) { printf("c[%d]=%d\n", i, c[i]); } return 0; }
修正说明
- 先输入n再定义数组,避免const变量修改的问题,保证数组大小匹配用户输入。
- 将
suma的初始化放到行循环内部,每行开始时重置为0,实现按行独立计数。 - 每行统计完成后,将结果存入对应的
c[i],最后遍历输出c数组的每个元素。 - 若编译器不支持变长数组,可改用动态内存分配替代:
int **a = (int**)malloc(n * sizeof(int*)); for (i = 0; i < n; i++) { a[i] = (int*)malloc(n * sizeof(int)); } // 使用完后记得释放内存 for (i = 0; i < n; i++) { free(a[i]); } free(a);
内容的提问来源于stack exchange,提问作者Калоян Георгиев
相关产品推荐
相关产品推荐

