这是我的代码重复读取由用户的空格分隔的三个变量。输入格式应为'char int int'(例如b 3 3)。我使用scanf函数的返回值来确保输入正好是三个变量。
#include <stdio.h>
int main(void){
int x, y, nargs;
char command;
while(1){
nargs = scanf("%c %d %d", &command, &x, &y);
printf("%d\n",nargs);
if(nargs != 3){
printf("error\n");
break;
}
}
return 0;
}
输入和输出:
g 4 4
3
b 3 3
1
error
第一行输入没问题。但是当我输入第二行时,它显示scanf()只从该行读取一个变量。我的代码有什么问题?
答案 0 :(得分:2)
问题是您发送到stdin的两条输入行之间隐藏了\n
换行符。在第一个scanf
之后,您在输入流上有'\n'
个待处理项,然后您附加"b 3 3"
,以便整个缓冲区看起来像"\nb 3 3"
。
然后再次调用scanf
并且\n
与%c
匹配,scanf
期望空格但缓冲区有'b'
,因此在分配{{}后失败{1}}至\n
。
您可以尝试与
匹配command
以便从cppreference开始使用之前的nargs = scanf("%c %d %d ", &command, &x, &y);
^
换行换行符:
格式字符串中的任何单个空白字符都会使用输入中的所有可用连续空白字符
答案 1 :(得分:-2)
nargs = scanf("%1s %d %d", &command, &x, &y);
问题在于%c
一个字符。如果你为%1s
更改它,你会期望一个字符串(相同)但没有问题。
使用%c
最好将结果发送到数组,并使用其索引访问内容。