如何读取这种格式的数据?

时间:2016-02-10 13:09:56

标签: c input scanf

输入中的每一行都以一个字母开头,然后根据字母我要读取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是:1 0 0”,并且它这样做了两次。我对这里发生的事情感到很困惑。

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

2 个答案:

答案 0 :(得分:1)

我可以看到,您需要从\n格式字符串中删除scanf(),例如

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

只读一个int

那就是说,在第二种情况下,你需要修改像

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

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

答案 1 :(得分:0)

scanf("%d %d %d\n", args, args+1, args+2);

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

拉​​斯

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