编译器不会在scanf()上停止输入

时间:2014-11-25 15:02:52

标签: c loops input char scanf

这是一个小C代码

  #include<stdio.h>
  int main()
  {
    char ch='Y';
    while(ch=='Y')
    {
      printf("\nEnter new value for Y ");
      scanf("%c",&ch);
      if(ch=='Y' || ch=='y')
        // do some work 
        printf("Y was selected\n");
    }
    printf("exiting main");
    return 0;
  }

我第一次输入'Y'作为输入(没有qoutes),循环返回true并第二次进入内部,但这次它没有在scanf()上停止用户输入。(请执行为清晰起见,输入为“Y”。输出如下所示:

enter image description here

如此处所示,编译器第二次没有停止输入。这背后的原因是什么?提前谢谢!

2 个答案:

答案 0 :(得分:1)

只需在scanf中添加一个空格,如下所示:

scanf(" %c",&ch);

原因是你输入:Y\n(带回车)
scanf只读取Y!所以在下一个scanf \n仍在缓冲区中并且已经读入了!

所以,如果你现在有一个空间,在你读新的东西之前就会有一个空格(看起来像这样:'\ n')!

答案 1 :(得分:0)

'\n'自动成为下一次迭代的输入。

要避免使用此getchar()。它将处理不需要的'\n'

#include<stdio.h>
  int main()
  {
    char ch='Y';
    while(ch=='Y')
    {
      printf("\nEnter new value for Y ");
      scanf("%c",&ch);

      getchar();  //takes care of '\n'

      if(ch=='Y' || ch=='y')
        // do some work 
        printf("Y was selected\n");
    }
    printf("exiting main");
    return 0;
  }

现在代码工作正常。以下是命令窗口中的代码段。

Enter new value for Y Y
Y was selected

Enter new value for Y Y
Y was selected

Enter new value for Y _