输入中的每一行都以一个字母开头,然后根据字母我要读取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个,与上面相同的问题)。
答案 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将数组名称视为指针。