【问题标题】:How to read data of this format?如何读取这种格式的数据?
【发布时间】:2016-02-10 13:09:56
【问题描述】:

我输入的每一行都以一个字母开头,然后根据字母,我必须准确读取 1 个数字,或者 0 到 3 之间的任意数量的数字。这是我尝试这样做的方法:

#include <stdio.h>

int main()
{
    int args[3] = { 0, 0, 0 };
    char cmd;
    int filled;

    for(;;)
    {
        scanf("%c", &cmd);
        switch(cmd)
        {
            case 'a':
                scanf("%d\n", args);
                break;
            case 'b':
                filled = scanf("%d %d %d\n", args, args+1, args+2);
                printf("Read %d\n", filled);
                break;
        }
        printf("Args is: %d %d %d\n", args[0], args[1], args[2]);
    }
    return 0;
}

a 的问题是,在我写完a 1 之后,由于某种原因,它又等待了 1 个字符,例如a 1 2 输出“Args is: 1 0 0”,它这样做了两次。我完全不知道这里发生了什么。

b 选项也不起作用,我的程序正在等待正好 4 个数字(4,而不是 3,与上述相同的问题)。

【问题讨论】:

  • 如果您的输入格式是面向行的,通常最好读取整行(使用fgets()),然后在内存中解析一次。由于FILE * 流的状态,这消除了隐藏的复杂性。

标签: c input scanf


【解决方案1】:

如我所见,您需要从scanf() 格式字符串中删除\n,例如

 scanf("%d", &args[0]);

只读取一个int。

也就是说,第二种情况,你需要修改like

filled = scanf("%d %d %d", &args[0], &args[1], &args[2]);

但是,更优雅和强大的解决方案是使用 fgets() 一次读取完整的行,然后根据要求进行标记。

【讨论】:

  • 该修改不起作用,因为现在它允许像a 1 a 2 这样的输入。然而,fgets() 成功了。
  • @Dunno 1) 这就是scanf() 返回值的原因 2) 始终尝试坚持使用fgets(),好多了。
  • 从现在开始会做,甚至不知道它在那里。
【解决方案2】:
scanf("%d %d %d\n", args, args+1, args+2);

删除\n,它将按您的预期工作。当您将\n 放入告诉程序读取\n 的格式规范中时。因此,程序看不到您必须在数据末尾输入的回车键。如果您在末尾不键入回车键,scanf 将继续无限期地读取输入,但不会存储超出给定格式说明符的任何内容。

罗斯

编辑:前面的答案是正确的,更标准的方法是使用&amp;args[0]、&amp;args[1] 等,但是您编写它的方式将起作用,因为 c 将数组名称视为指针。

【讨论】:

  • 这种方法效果不好。在scanf("%c", &amp;cmd); 的下一次迭代中,这将使cmd --> '\n'。
猜你喜欢
  • 2013-08-06
  • 2014-10-02
  • 2014-08-04
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
相关资源
最近更新 更多