scanf()的行为

时间:2014-03-07 16:12:03

标签: c scanf

为什么程序没有在第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()没有执行但是为什么?

3 个答案:

答案 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