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

C语言矩阵加法函数未正确打印结果问题求助

问题排查:矩阵相加仅输出第二个矩阵的原因及修复

问题现象

编写C语言矩阵加法计算器时,输入两个矩阵后,输出结果始终是第二个矩阵的内容,而非两矩阵相加的结果。

核心错误分析

  1. 局部变量遮蔽全局变量
    在fillMatrix函数中,你重新定义了局部数组int matrix1[r1][c1];,这个局部变量会遮蔽全局的matrix1数组。用户输入的第一个矩阵元素全部存储在这个局部数组中,函数执行完毕后局部数组被销毁,全局matrix1始终是初始值0。最终相加时实际是0 + matrix2[i][j],结果自然等于第二个矩阵。

  2. 缺少矩阵相加合法性检查
    矩阵相加的数学规则要求两个矩阵的行数和列数必须完全相同,代码中未做此检查,若输入尺寸不匹配会导致越界访问或错误结果。

  3. 循环索引不一致
    初始化finalmatrix时使用了c2作为列数循环上限,而合法相加场景下c1应等于c2,这种不一致容易引发逻辑混乱。

修复后的完整代码

#include <stdio.h>
#include <stdlib.h> // 用于exit函数

int r1, c1, r2, c2, i, j;
int matrix1[100][100], matrix2[100][100], finalmatrix[100][100];

void fillMatrix() {
    printf("Enter the number of rows of first matrix: \n");
    scanf("%d", &r1);
    printf("Enter the number of columns of first matrix: \n");
    scanf("%d", &c1);
    printf("First matrix sizes are:[%d][%d] \n", r1, c1);

    printf("\nEnter elements of 1st matrix:\n");
    for (i = 0; i < r1; ++i)
        for (j = 0; j < c1; ++j) {
            printf("Enter element a%d%d: \n", i + 1, j + 1);
            scanf("%d", &matrix1[i][j]);
        }

    printf("Enter the number of rows of second matrix: \n");
    scanf("%d", &r2);
    printf("Enter the number of columns of second matrix: \n");
    scanf("%d", &c2);
    printf("Second matrix sizes are:[%d][%d] \n", r2, c2);

    printf("\nEnter elements of 2nd matrix: \n");
    for (i = 0; i < r2; i++)
        for (j = 0; j < c2; j++) {
            printf("Enter the element a%d%d: \n", i + 1, j + 1);
            scanf("%d", &matrix2[i][j]);
        }
}

void addMatrix() {
    // 检查矩阵尺寸是否符合相加要求
    if (r1 != r2 || c1 != c2) {
        printf("Error: Matrices must have the same number of rows and columns to add.\n");
        exit(1);
    }

    // 初始化结果矩阵
    for (i = 0; i < r1; i++)
        for (j = 0; j < c1; ++j)
            finalmatrix[i][j] = 0;

    // 矩阵相加
    for (i = 0; i < r1; i++)
        for (j = 0; j < c1; j++)
            finalmatrix[i][j] = matrix1[i][j] + matrix2[i][j];

    // 打印结果矩阵
    printf("The resulting matrix is: \n");
    for (i = 0; i < r1; i++) {
        for (j = 0; j < c1; j++) {
            printf("%d ", finalmatrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    fillMatrix();
    addMatrix();
    return 0;
}

额外优化建议

  • 减少全局变量依赖:将矩阵尺寸和数组作为函数参数传递,避免全局变量带来的耦合性和意外修改风险。
  • 增加输入合法性校验:检查输入的行数、列数是否为正整数,且不超过数组最大限制(100),避免数组越界访问。
  • 代码格式化:保持一致的缩进和代码风格,提升可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:24:17