C 如何将两个二维数组中的整数添加到用户指定长度的新二维数组中?

C 如何将两个二维数组中的整数添加到用户指定长度的新二维数组中?,c,arrays,function,loops,C,Arrays,Function,Loops,我是一个新手,今年是我第一次学习c。我遇到了一个关于2D数组之类的问题。问题是:编写一个程序,求两个二维矩阵的和 我可以很容易地做到这一点,但我遇到了一个问题。例如,我将为第一组数组指定3x3的长度 如果我的第一个二维阵列和第二个阵列具有: {1,2,3;4,5,6;7,8,9}(第一个数组) {0,0,0;0,0,0;0,0,0}(第二数组) 我还得到了一个用户提供的行数和列数。(用户输入3x2)然后它应该显示为 {1,2;3,4;5,6}(输出) 但是我越来越 {1,2;3,5;6

我是一个新手,今年是我第一次学习c。我遇到了一个关于2D数组之类的问题。问题是:编写一个程序,求两个二维矩阵的和

我可以很容易地做到这一点,但我遇到了一个问题。例如,我将为第一组数组指定3x3的长度

如果我的第一个二维阵列和第二个阵列具有:

  • {1,2,3;4,5,6;7,8,9}(第一个数组)
  • {0,0,0;0,0,0;0,0,0}(第二数组)
我还得到了一个用户提供的行数和列数。(用户输入3x2)然后它应该显示为

  • {1,2;3,4;5,6}(输出)
但是我越来越

  • {1,2;3,5;6,8}
另一个例子

  • 用户输入2x4输出应为{1,2,3,4;5,6,7,8}
我做错了什么

#include <stdio.h>
#include <stdlib.h>

#define MAXROW 3
#define MAXCOL 3

int main() {
    int ray1[MAXROW][MAXCOL], ray2[MAXROW][MAXCOL];
    int r, c;
    printf("Enter the number of ROWS: ");
    scanf("%d", &r);
    printf("Enter the number of COLUMNS: ");
    scanf("%d", &c);

    int sumRay[r][c];

    printf("\n");

    printf("Input integers for Array %d.\n", 1);
    arrayIN(ray1);

    printRay(ray1);
    printf("Input integers for Array %d.\n", 2);
    arrayIN(ray2);

    printRay(ray2);
    arraySUM(ray1, ray2, r, c, sumRay);
    printSumRay(r, c, sumRay);

    //printRay(sumRay);
}

void arrayIN(int ray[MAXROW][MAXCOL]) {
    int r, c;
    for (r = 0; r < MAXROW; r++) {
        for (c = 0; c < MAXCOL; c++) {
            printf("Enter Number for [ROW:%d COL:%d]: ", r, c);
            scanf("%d", &ray[r][c]);
        }
    }
}

void arraySUM(int ray1[MAXROW][MAXCOL], int ray2[MAXROW][MAXCOL],
              int r, int c, int sumRay[r][c]) {
    int i, j;
    int x, y;
    i = j = 0;
    int sum;
    for (x = 0; x <= r; x++, i++) {
        if (i < MAXROW) {
            for (y = 0; y <= c; y++, j++) {
                if (j < MAXCOL) {
                    sum = ray1[i][j] + ray2[i][j];
                    sumRay[x][y]= sum;
                } else {
                    j = 0;
                }
            }
        } else {
            i = 0;
        }
    }
    printf("\n");
}

void printSumRay(int r, int c, int sumRay[r][c]) {
    int i, j;
    for (i = 0; i < r; i++) {
        printf("\n");
        for (j = 0; j < c; j++) {
            printf("%d\t", sumRay[i][j]);
        }
    }
}

void printRay(int ray[MAXROW][MAXCOL]) {
    int i, j;
    for (i = 0; i < 3; i++) {
        printf("\n");
        for (j = 0; j < 3; j++) {
            printf("%d\t", ray[i][j]);
        }
    }
    printf("\n");
}
#包括
#包括
#定义MAXROW 3
#定义MAXCOL 3
int main(){
int ray1[MAXROW][MAXCOL],ray2[MAXROW][MAXCOL];
int r,c;
printf(“输入行数:”);
scanf(“%d”、&r);
printf(“输入列数:”);
scanf(“%d”、&c);
int sumRay[r][c];
printf(“\n”);
printf(“数组%d的输入整数。\n”,1);
arrayIN(ray1);
printRay(ray1);
printf(“数组%d的输入整数。\n”,2);
arrayIN(ray2);
printRay(ray2);
arraySUM(ray1,ray2,r,c,sumRay);
printSumRay(r,c,sumRay);
//printRay(sumRay);
}
void arrayIN(int-ray[MAXROW][MAXCOL]){
int r,c;
对于(r=0;r对于(x=0;x首先,您需要将函数原型放在
main()
之前,或者至少将函数定义移到
main()
之前。我一点也不清楚为什么要将VLA用于
sumRay[]
,而将恒定尺寸的数组用于
ray1[]
ray2[][]
。除非您有令人信服的理由这样做,否则最好全面使用VLA

对于包含数组索引的变量,应该使用
size\t
类型。然后必须修改处理
size\t
变量的
scanf()
printf()
语句,以使用
%zu
转换说明符

arraySum()
函数迭代两对重复的数组索引,原因不明。此处的逻辑错综复杂。您报告的虚假输出可追溯到此函数;很难读取和理解,这应该是需要重写的迹象。如果您打算添加nput阵列只是部分,名称并不反映这一意图。我简化了此功能,收紧了逻辑并消除了重复。有关部分阵列添加的版本,请参阅下面的更新

printSumRay()
函数似乎是多余的,因为
printRay()
函数可以做同样的工作,所以我删除了它,重写了
printRay()
使用VLA并收紧代码。原始代码在这里循环的控制表达式中使用了幻数
3
,而不是利用
MAXROW
MAXCOL
。但是,即使不使用VLA,也最好将维度传递给任何将使用a的函数雷

以下是原始代码的修改版本:

#include <stdio.h>
#include <stdlib.h>

void arrayIN(size_t r, size_t c, int ray[r][c]);
void arraySUM(size_t r, size_t c, int ray1[r][c], int ray2[r][c], int sumRay[r][c]);
void printRay(size_t r, size_t c, int ray[r][c]);

int main(void)
{

    size_t r,c;

    printf("Enter the number of ROWS: ");
    scanf("%zu", &r);
    printf("Enter the number of COLUMNS: ");
    scanf("%zu", &c);

    int ray1[r][c], ray2[r][c], sumRay[r][c];

    printf("\n");

    printf("Input integers for Array %d.\n", 1);
    arrayIN(r, c, ray1);
    putchar('\n');

    printRay(r, c, ray1);
    putchar('\n');

    printf("Input integers for Array %d.\n", 2);
    arrayIN(r, c, ray2);
    putchar('\n');

    printRay(r, c, ray2);
    putchar('\n');

    arraySUM(r, c, ray1, ray2, sumRay);
    printRay(r, c, sumRay);
    putchar('\n');

    return 0;
}

void arrayIN(size_t r, size_t c, int ray[r][c])
{
    for(size_t i = 0; i < r; i++) {
        for(size_t j = 0; j < c; j++) {
            printf("Enter Number for [ROW:%zu COL:%zu]: ", i, j);
            scanf("%d", &ray[i][j]);
        }
    }
}

void arraySUM(size_t r, size_t c, int ray1[r][c],int ray2[r][c], int sumRay[r][c])
{
    for(size_t i = 0; i < r; i++) {
        for(size_t j = 0; j < c; j++) {
            sumRay[i][j] = ray1[i][j] + ray2[i][j];
        }
    }
}

void printRay(size_t r, size_t c, int ray[r][c])
{
    for(size_t i = 0; i < r; i++) {
        for(size_t j = 0; j < c; j++) {
            printf("%8d",ray[i][j]);
        }
        putchar('\n');
    }
}
样本交互:

Enter the number of ROWS: 2
Enter the number of COLUMNS: 2

Input integers for Array 1.
Enter Number for [ROW:0 COL:0]: 1
Enter Number for [ROW:0 COL:1]: 2
Enter Number for [ROW:0 COL:2]: 3
Enter Number for [ROW:1 COL:0]: 4
Enter Number for [ROW:1 COL:1]: 5
Enter Number for [ROW:1 COL:2]: 6
Enter Number for [ROW:2 COL:0]: 7
Enter Number for [ROW:2 COL:1]: 8
Enter Number for [ROW:2 COL:2]: 9

       1       2       3
       4       5       6
       7       8       9

Input integers for Array 2.
Enter Number for [ROW:0 COL:0]: 1
Enter Number for [ROW:0 COL:1]: 1
Enter Number for [ROW:0 COL:2]: 1
Enter Number for [ROW:1 COL:0]: 1
Enter Number for [ROW:1 COL:1]: 1
Enter Number for [ROW:1 COL:2]: 1
Enter Number for [ROW:2 COL:0]: 1
Enter Number for [ROW:2 COL:1]: 1
Enter Number for [ROW:2 COL:2]: 1

       1       1       1
       1       1       1
       1       1       1

       2       3
       5       6

只需要一个小改动。在arraySUM()中,在else部分中,您已重新初始化

i=0,j=0

但在重新初始化之后,它们会递增。因此,它将变为1,因此在执行时,它将读取光线[1],而不是光线[0]

只需将它们重新初始化为-1

i=-1和j=-1


嗯,我希望
@CristianG--我已经用一个新函数对我的答案进行了更新,该函数只合并了输入数组的初始行和列。+1嗨,看起来我误解了这个问题,用户指定的维度适用于所有数组,这是你的第一个答案。无论如何,谢谢你的帮助!仍然在学习C的一些怪癖所以请原谅我,哈哈,再次谢谢你!
Enter the number of ROWS: 2
Enter the number of COLUMNS: 2

Input integers for Array 1.
Enter Number for [ROW:0 COL:0]: 1
Enter Number for [ROW:0 COL:1]: 2
Enter Number for [ROW:0 COL:2]: 3
Enter Number for [ROW:1 COL:0]: 4
Enter Number for [ROW:1 COL:1]: 5
Enter Number for [ROW:1 COL:2]: 6
Enter Number for [ROW:2 COL:0]: 7
Enter Number for [ROW:2 COL:1]: 8
Enter Number for [ROW:2 COL:2]: 9

       1       2       3
       4       5       6
       7       8       9

Input integers for Array 2.
Enter Number for [ROW:0 COL:0]: 1
Enter Number for [ROW:0 COL:1]: 1
Enter Number for [ROW:0 COL:2]: 1
Enter Number for [ROW:1 COL:0]: 1
Enter Number for [ROW:1 COL:1]: 1
Enter Number for [ROW:1 COL:2]: 1
Enter Number for [ROW:2 COL:0]: 1
Enter Number for [ROW:2 COL:1]: 1
Enter Number for [ROW:2 COL:2]: 1

       1       1       1
       1       1       1
       1       1       1

       2       3
       5       6