【问题标题】:Reading input from stdin using scanf() in C在 C 中使用 scanf() 从标准输入读取输入
【发布时间】:2018-08-31 10:26:52
【问题描述】:

假设输入是:

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

6 和 4 分别是宽度和高度。 我用的是:

scanf("%d %d", &width, &height);

然后我使用 for 循环将其余输入放入二维数组 (board[height][width])。 问题在于验证宽度和高度。

当我输入时

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

错过了一个输入,但它会等到再输入一个数字。如果输入的输入不足或过多,我该如何管理并使其发生错误?

有人可以帮我解决这个问题吗?谢谢!!

【问题讨论】:

  • scanf 返回一个值。首先检查一下。
  • 您的问题是在创建整个板后检查给定的宽度和高度输入是否正确?您可以在将值插入board 时保留一个计数器并检查它是否等于width * height。然而,这将是一个幼稚的检查
  • 我知道 if(scanf("%d %d", &width, &height) != 2) {} 但是 6 4 0 1 2 2 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 1 1 1 0 也打印输出...是否有通过按回车键将宽度和高度与其余输入分开?
  • 比如我把6 4按回车然后剩下的输入,否则会报错。所以 6 4 0 1 2 2 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 1 1 1 0 应该会发生错误,因为即使我在 6 和 4 之后不按 enter,它也会打印输出。
  • scanf() 系列函数不关心换行;它们只是要消耗的空白空间。如果您关心行,请使用fgets() 阅读并使用sscanf() 进行解析。请注意,只要数字之间有空格,整个数据集就可以在一行上,或者每个数字可以单独在一行上,连续数字之间有任意数量的空白行。您不会发现与 scanf() 的区别。

标签: c multidimensional-array scanf


【解决方案1】:

您可以使用getsstrtokatoi 来完成它。

以下是完整的工作代码。见here工作:

#include <stdio.h>
#include <string.h>

int main(void) {
    int w, h, i, j;
    char buffer[100];
    scanf("%d %d", &w, &h);
    int num[w][h];
    gets(buffer);
    for(i=0; i<h; i++)
    {
        gets(buffer);
        char *token = strtok(buffer, " ");
        for(j =w; j && token; j--)
        {
            num[i][w-j] = atoi(token);
            token = strtok(NULL, " ");
        }
        if(j)
        {
            //Do what you wish to do on error
            printf("\nError!!! %d inputs are missing\n", j);
        }
    }
    for(int i=0; i<h; i++)
    {
        for(int j =0; j<w; j++)
            printf("%d ", num[i][j]);
        printf("\n");
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多