c - 在 C 中输入到多数组

标签 c arrays input scanf

我正在尝试将用户输入分配给一个数组;然而,下面的程序只获取每行输入中的第一个元素。该程序的最终目标是找到整数的对角线和并返回它们差的绝对值。

示例输入(注意第一个数字给出了行数和列数(方阵):

输入: 3

11 2 4

4 5 6

10 8 -12

输出: 预期 = 15 实际 = 10

我意识到问题在于数组的设置方式。如果我打印数组,我得到:111555999

任何提示/帮助将不胜感激。

int main() {
    int n, i, c, multi_array[200][200], sum1 = 0, sum2 = 0;

    scanf("%i", &n);   //N = number of rows and number of columns (square 2D array)

    for (i = 0; i < n; i++) {
        for (c = 0; c < n; c++) {
            scanf("%d ", &multi_array[c][i]);   //enter integers to store in array
        }
    }

    for (i = 0; i != n; i++) {
        sum1 += multi_array[i][i];    //add up top left to bottom right diagonal
    }

    for (i = 0; i != n; i++) {
        sum2 += multi_array[i][n-i];    //add up top right to bottom left diagonal
    }
    printf("%i", abs(sum1 - sum2));    //print absolute value of the difference between diagonals
    return 0;
}

最佳答案

你的主要问题在这里,你越界了:

for (i = 0; i != n; i++) {
  sum2 += multi_array[i][n - i]; // when i is 0, th
}

当 i = 0 时,您正在访问 multi_array[0][3],当 N = 3 时,这是越界的。

所以改成这样:

multi_array[i][n - i - 1]

你应该像这样阅读你的数组:

for (i = 0; i < n; i++) {
  for (c = 0; c < n; c++) {
    scanf(" %d ", &multi_array[i][c]);
  }
}

因为 C 以行优先顺序存储它的数组。您所拥有的以列优先顺序存储数组。这并没有错,但只有在确实需要时才这样做。


最后,再次将代码的输入部分更改为:

scanf("%d", &n);

for (i = 0; i < n; i++) {
    for (c = 0; c < n; c++) {
        scanf("%d", &multi_array[i][c]);
    }
}

因此您必须准确输入您需要的内容。使用您的初始代码,我必须在完成输入过程后输入一个额外的随机数。


最后但同样重要的是,我发布了整个代码,其中我写了一些额外的 printf(),实际上是为程序员准备的,这样他就可以一步一步地看到-判断他的代码是否按预期运行的步骤。

#include <stdio.h>
#include <stdlib.h>     /* abs */

int main() {
    int n, i, c, multi_array[200][200], sum1 = 0, sum2 = 0;

    scanf("%d", &n);

    for (i = 0; i < n; i++) {
        for (c = 0; c < n; c++) {
            scanf("%d", &multi_array[i][c]);
        }
    }

    for (i = 0; i < n; i++) {
        for (c = 0; c < n; c++) {
            printf("|%d|", multi_array[i][c]);
        }
        printf("\n");
    }

    for (i = 0; i != n; i++) {
        sum1 += multi_array[i][i];
    }
    printf("sum1 is %d\n", sum1);

    for (i = 0; i != n; i++) {
        sum2 += multi_array[i][n - i - 1];
    }
    printf("sum2 is %d\n", sum2);

    printf("%i", abs(sum1 - sum2));
    return 0;
}

输出:

3
11 2 4
4 5 6
10 8 -12
|11||2||4|
|4||5||6|
|10||8||-12|
sum1 is 4
sum2 is 19
15

关于c - 在 C 中输入到多数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33813290/

相关文章:

c - 为什么“while(!feof(file))”总是错误的?

javascript - 每个列表项的颜色选择器未正确显示

html - 无法在 HTML 文本输入框中显示值

html - Bootstrap 输入附加不适用于流体网格

c - 如何快速转储信息?

objective-c - 如何学习 C 和 Objective-C

arrays - 双端动态数组数据结构的缺点是什么?

java - 递归查找数组中的最大数

jquery - 使用 JQuery,如何防止用户在输入字段中输入脚本或 html?

C: malloc() 忽略请求的大小?