【问题标题】:Getting wrong output when adding elements in 2D Array在二维数组中添加元素时得到错误的输出
【发布时间】:2020-10-07 08:04:12
【问题描述】:

我现在正在学习 C 编程,当我在数组中添加两个元素时,我没有得到正确的输出,我期待你的帮助来了解这个问题。

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

int main(void) {
    int limit = 0, sum[limit][3];
    int a[limit][3];
    int b[limit][3];

    printf("Enter the size of arrays: \n");
    fflush(stdout);
    scanf("%d", &limit);
    printf("Enter the values of Array 1");
    fflush(stdout);
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < limit; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    printf("Array 1: \n");
    fflush(stdout);
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < limit; j++) {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
    printf("Enter the values of Array 2");
    fflush(stdout);
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < limit; j++) {
            scanf("%d", &b[i][j]);
        }
    }
    printf("Array 2: \n");
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < limit; j++) {
            printf("%d\t", b[i][j]);
        }
        printf("\n");
    }
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < limit; j++) {
            sum[i][j]= a[i][j] + b[i][j];
        }
    }
    printf("Sum of 2 arrays: \n");
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < limit; j++) {
            printf("%d\t", sum[i][j]);
        }
        printf("\n");
    }

    return EXIT_SUCCESS;
}

当前输出:

输入数组的大小:

3

输入数组 1 的值

12
12
12
12
12
12
12
12
12

数组 1:

12  12  12  
12  12  12  
12  12  12  

输入数组 2 的值

11
11
11
11
11
11
11
11
11

数组 2:

11  11  11  
11  11  11  
11  11  11  

2 个数组的总和:

22  22  22  
22  22  22  
22  22  22  

我发现我在代码中给出的确切数组不能锻炼。 我的预期输出是:

23 23 23
23 23 23
23 23 23

【问题讨论】:

  • 如果您的第 2 维是常数“3”,并且您在这 3 个项目上循环 limit 次,难怪会出现问题。此外,难怪在调整数组大小时limit 为 0 时会出现问题。
  • 打开编译器警告。

标签: arrays c multidimensional-array


【解决方案1】:

在:

int limit = 0, sum[limit][3];
int a[limit][3];
int b[limit][3];

limit 为 0,您的数组将为:

int sum [0][3];
int a[0][3];
int b[0][3];

他们将有空余空间。

您应该只在limit 输入之后声明您的数组。

还要注意,数组的第二维固定在3,在您的内部for 循环中,而不是使用limit,您应该使用该常量值,否则,如果limit 是4 或更多,您的程序将访问超出其边界的数组,调用未定义的行为。

【讨论】:

  • 太棒了!得到了预期的输出。
【解决方案2】:

有多个问题:

  • 数组的定义维度设置为 0:

      int limit = 0, sum[limit][3];
      int a[limit][3];
      int b[limit][3];
    

您应该在读取 og limit 的值后定义数组。

  • 嵌套循环使用了不正确的边界测试:

      for (int i = 0; i < limit; i++) {
          for (int j = 0; j < limit; j++) {
    

j 应该从 0 迭代到 3 排除。

这是修改后的版本:

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

int main(void) {
    int limit = 0;

    printf("Enter the size of arrays: \n");
    fflush(stdout);
    if (scanf("%d", &limit) != 1 || limit < 1)
        return 1;

    int sum[limit][3];
    int a[limit][3];
    int b[limit][3];

    printf("Enter the values of Array 1");
    fflush(stdout);
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < 3; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    printf("Array 1: \n");
    fflush(stdout);
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
    printf("Enter the values of Array 2");
    fflush(stdout);
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < 3; j++) {
            scanf("%d", &b[i][j]);
        }
    }
    printf("Array 2: \n");
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d\t", b[i][j]);
        }
        printf("\n");
    }
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < 3; j++) {
            sum[i][j] = a[i][j] + b[i][j];
        }
    }
    printf("Sum of 2 arrays: \n");
    for (int i = 0; i < limit; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d\t", sum[i][j]);
        }
        printf("\n");
    }

    return EXIT_SUCCESS;
}

【讨论】:

    【解决方案3】:

    在内部嵌套循环中,j 应该迭代直到 j(不包括它)而不是限制。 所需的嵌套循环应该是-

    for (int i = 0; i < limit; i++) {
          for (int j = 0; j < 3; j++) {
    .
    .
    }
    

    提示:在从用户处获取数组的输入/大小后声明您的数组。

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多