为什么程序没有在第4行停止输入?
int main(int argc, char *argv[])
{
int a, b;
char c1, c2;
printf("Enter something: ");
scanf("%d",&a); // line 1
printf("Enter other something: ");
scanf("%d", &b); // line 2
printf("Enter a char: ");
scanf("%d",&c1); // line 3
printf("Enter other char: ");
scanf("%d", &c2); // line 4
printf("Done"); // line 5
system("PAUSE");
return 0;
}
我从一本书中读到了这个问题,在第4行上面,scanf()没有执行但是为什么?
答案 0 :(得分:2)
%d
期望从输入读取一堆数字,这样它就可以形成一个整数并将结果存储到你传递的指针中(在这个例子中这是无效的,因为你提供了一个指向char的指针,但无论如何,这与此无关。)
问题是如果你输入一个字符,scanf()
会注意到输入中没有有效数字。它将读取此字符,将其推回输入,并提前返回。这发生在第3行。由于字符被推回,第4行将再次从输入中检索相同的字符,并看到输入中没有有效的整数,因此再次推回相同的字符。
这里要记住的关键点是scanf
过早返回无效输入,保持输入流不受影响。
例如,如果stdin
包含字符a
,则第3行的scanf()
将从输入中检索a
。它发现这不是有效数字,因此a
“返回”到stdin
并返回scanf()
。在第4行,scanf
调用将执行相同的操作:它从输入中选择下一个项目,它是相同的a
,并提前返回。 在使用此字符之前,扫描整数将无效。例如,如果您在第3行之后调用getchar()
,则会消耗有问题的字符,而第4行的scanf()
将等待输入。
答案 1 :(得分:2)
scanf
有换行问题。解决此问题的快速而肮脏的方法是在\n
之前添加空格或%c
以绕过该位置...
printf("Enter a char: ");
scanf(" %c",&c1); // line 3
printf("Enter other char: ");
scanf(" %c", &c2); // line 4
答案 2 :(得分:0)
printf("Enter a char: ");
scanf("%c",&c1); // line 3
printf("Enter other char: ");
scanf("%c", &c2); // line 4
用%c(从十进制到字符)更改%d