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

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;
}

修正说明

  1. 先输入n再定义数组,避免const变量修改的问题,保证数组大小匹配用户输入。
  2. 将suma的初始化放到行循环内部,每行开始时重置为0,实现按行独立计数。
  3. 每行统计完成后,将结果存入对应的c[i],最后遍历输出c数组的每个元素。
  4. 若编译器不支持变长数组,可改用动态内存分配替代:
    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,提问作者Калоян Георгиев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:05:16