【问题标题】:While-loop ignores scanf the second timeWhile-loop 第二次忽略 scanf
【发布时间】:2011-11-28 19:10:13
【问题描述】:
#include <stdio.h>

int main ()
{
    char loop='y';
    while(loop != 'n') {
        printf("loop? ");
        scanf("%c", &loop);
        if(loop != 'y') {
            loop='n';
        }
    }
    return 0;
}

如果我输入“y”,他会重新启动 while 循环,但第二次忽略 scanf 并在此之后结束循环。有人可以帮忙吗?

【问题讨论】:

标签: c while-loop scanf


【解决方案1】:

确保scanf 丢弃换行符。将其更改为:

scanf(" %c", &loop);
       ^

【讨论】:

  • @user1069968 该空格使scanf 忽略所有空格(包括换行符)。
【解决方案2】:

您可能必须输入一个换行符才能将输入转到您的程序,对吧?第二次执行循环时,它会读取换行符,该换行符正在“等待”被读取并自动退出循环 ('\n' != 'y')。您可以改为使用此格式字符串使 scanf 忽略空格:

" %c"

【讨论】:

  • 这是该线程上最好的解释答案。谢谢你救了我女朋友的作业!
  • 谢谢@AustinWitherow,我很高兴知道它对你有用:)
【解决方案3】:

一种解决方案是在scanf() 语句之后使用fflush(stdin) 来清除输入缓冲区。

【讨论】:

  • fflush(stdin) 在 C 编程中具有未定义的行为。它可能在某些系统上按预期工作,但一般来说这不是好的做法。
  • @NisseEngström 谢谢 Nisse,我同意你的观点。这不是一个好的做法,我们可以在这里看到stackoverflow.com/questions/9122550/…
  • fflush stdin 也可以在 linux 上工作,但避免使用它的 UB,使用它会失去可移植性。
猜你喜欢
  • 1970-01-01
  • 2021-10-17
  • 2014-10-27
  • 2013-01-25
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多