【问题标题】:Compiler doesn't stop on scanf() for input编译器不会在 scanf() 上停止输入
【发布时间】:2015-01-23 15:41:23
【问题描述】:

这是一个小 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”)。输出如下所示:

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

【问题讨论】:

标签: c loops input char scanf


【解决方案1】:

像这样在scanf中放一个空格:

scanf(" %c",&ch);

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

因此,如果您现在在阅读新内容之前有一个空格,那么它会有所作为(看起来像这样:'\n')!

【讨论】:

  • 是的,明白了。谢谢:)
  • 替代:scanf("%c%*c", &amp;ch);
【解决方案2】:

'\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;
  }

代码现在可以正常工作了。下面是命令窗口中的 sn-p。

Enter new value for Y Y
Y was selected

Enter new value for Y Y
Y was selected

Enter new value for Y _

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多