【问题标题】:Using Scanf for Storing Input in 2d Arrays使用 Scanf 在二维数组中存储输入
【发布时间】:2014-12-20 10:37:56
【问题描述】:

我想扫描输入并将其保存在一个正方形二维数组中。

前两位保存在单独的变量中,第一位是目标数字(此处无关),第二位保存在变量m中,即m = 5 在这种情况下。 m 是方阵的行数/列数。输入的其余部分应保存在数组中。 对于这个特定的输入,我得到一个分段错误,随机数被打印在屏幕上。 我使用一些 printf 语句来跟踪哪里出了问题,我注意到第一个循环中的索引 i 在一个场景中从 2 跳到 11,对于其他输入它跳到 33。 谢谢你的帮助!我希望我没有遗漏一个明显的错误。

输入:(每行通过按回车键分隔。)

42 5

0 3 7 9 10

9 13 20 5 20

12 11 33 0 12

17 39 22 3 18

我的代码:

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

int main (int argc, char* arv[]){

  int target;               // for later processing, irrelevant here
  int m;                    // m = #rows and #columns of array
  int array[m][m];
  scanf("%d %d", &target, &m);
 
  int i, k;
  for(i = 0; i < m; i++){
    for(k = 0; k < m; k++){
       scanf("%d", &(array[i][k]));    // save value in array.
    }
  }
                                      // the problem occurs before this point.
  for(i = 0; i < m; i++){
     for(k = 0; k < m; k++){
       printf("%2d", array[i][k]);    // print array.
     }
     printf("\n");
  }  

  return 0;
}

【问题讨论】:

  • m 具有有意义的值之前,您声明了可变长度数组m。将该声明放在第一个 scanf 之后。
  • @MOehm 我不敢相信我只花了两个小时试图找出问题所在并错过了这一点。非常感谢!
  • 嗯,众所周知的新鲜眼睛......

标签: c arrays segmentation-fault scanf multidimensional-array


【解决方案1】:

在创建array[m][m] 之前,您还没有初始化m 的值。无需初始化,m 的值可以是任何值。

变化:

int array[m][m];
scanf("%d %d", &target, &m);

scanf("%d %d", &target, &m);
int array[m][m];

【讨论】:

    【解决方案2】:

    这是你搞砸的地方。

    int m;
    int array[m][m];
    

    这里,m 未初始化,您正在创建一个 m*m 元素数组。您需要在声明数组之前初始化m。因此,将数组声明移到 scanf 之后,以便在声明数组之前初始化 m

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      相关资源
      最近更新 更多