如何从stdin读取矩阵并在C中放入2D数组

时间:2018-03-26 07:08:06

标签: c multidimensional-array scanf

说输入(stdin)是:

6 4
0 1 1 1 1 0
1 0 0 0 0 1
1 0 0 0 0 1
0 1 1 1 1 0

在第一行中,6和4分别是宽度和高度。

我做了

fgets(buf, sizeof(buf), stdin);

if(strlen(buf) > 4 || strlen(buf) < 4)
{
    printf("Cannot decode\n");
    return 1;
}

因此,如果我将第一行(宽度和高度)的整数数大于或小于2,则按Enter键,则会发生错误。

下一步是将其余输入放在2D数组中,board [height] [width]。

我做的是:

for(i = 0; i < height; i++)
{
    for(j = 0; j < width; j++)
    {
        scanf("%d", &input);

        board[i][j] = input;
    }
}

但问题是,矩阵需要匹配宽度和高度。

例如,如果我分别输入6和4作为其宽度和高度, 然后,如果我把

0 1 1 1 1 

然后按回车键,它需要立即发生错误,因为整数和宽度不匹配。

scanf忽略了回车键......那么如果我输入一些与宽度和高度不匹配的整数,怎么能让程序出错?

1 个答案:

答案 0 :(得分:0)

  

那么如果我输入一些与宽度和高度不匹配的整数,怎么能让程序出错呢?

一种方法可能是:

1)将整行读成字符串 2)尝试从字符串

中读取width个整数

重复height次。

要跟踪字符串中的进度(步骤2),您可以在%n调用中使用sscanf来查找每次调用使用的字符数。

类似的东西:

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

int main(int argc, char *argv[])
{
  int i, j;
  int height, width;
  char buf[256];

  // Read size
  if (fgets(buf, sizeof(buf), stdin) == NULL)
  {
    printf("Illegal input\n");
    exit(1);
  }
  if (sscanf(buf, "%d %d", &width, &height) != 2)
  {
    printf("Illegal input\n");
    exit(1);
  }

  // Use VLA (note: only do this for small matrices)
  int board[height][width];

  // Read the matrix
  for (i=0; i < height; ++i)
  {
    if (fgets(buf, sizeof(buf), stdin) == NULL)
    {
      printf("Illegal input\n");
      exit(1);
    }
    int consumed = 0;
    int consumed_current;
    for (j=0; j < width; ++j)
    {
      // Scan from string offset "consumed"
      if (sscanf(buf+consumed, "%d%n", &board[i][j], &consumed_current) != 1)
      {
        printf("Illegal input\n");
        exit(1);
      }
      // Move the offset in the string
      consumed = consumed + consumed_current;
    }
  }

  // Print
  for (i=0; i < height; ++i)
  {
    for (j=0; j < width; ++j)
    {
      printf("%d ", board[i][j]);
    }
    printf("\n");
  }

  return(0);
}

注意:此代码仅检查 数据元素太少。如果输入行包含太多元素,则此代码将忽略其余元素。检查&#34;太多&#34;元素可以通过验证整个输入字符串已被sscanf使用来完成。