c - C 中的 Do-While 循环 - 打印时出错

标签 c printf do-while

我正在制作一个小程序,将“你是成年人吗?”这个问题的答案作为输入。作为这样的角色:

bool adult() {
    char answer;
    do {
        printf("Are you an adult? [y/n]\n");
        answer = getchar();
    } while (!(answer == 'y' || answer == 'n'));

    return (answer == 'y');
}

我的目标是,如果答案既不是 y 也不是 n,问题应该重复出现。但这似乎有一个错误:

当我回答其他问题(不是 y 或 n)时,问题会打印两次:

你成年了吗? 你 你是成年人吗? 你是成年人吗? ...

为什么会这样? 另外,我尝试过使用 scanf 而不是 getchar 的相同方法,但存在相同的错误。对于这种程序,我应该使用 scanf 还是 getchar,为什么?

谢谢!

最佳答案

实际上,答案中带有 (yes) y 或 (no) n 的额外 '\n' 会被计算在内并打印两次。你只记得得到那个虚拟的'\n'。使用另一个额外的 getchar()。虚拟 getchar() 是解决此问题的方法。

bool adult() {
    char answer;
    do {
        printf("Are you an adult? [y/n]\n");
        answer = getchar();
        getchar(); //~~~~~~~~~~~~~~~~~~~~> this is what gets the extra '\n'
    } while (!(answer == 'y' || answer == 'n'));

    return (answer == 'y');
}

你可以在这里查看我的其他答案。你会得到一个清晰的思路。 the input buffer in getchar() and scanf

编辑:正如 Random832 所指出的,在 yes\n 的情况下,ye 被消耗,但 s 没有消耗\n 。因此更好的解决方案是使用 do..while 或 while 循环存储第一个字符并消耗所有其他字符直到 \n。然后检查第一个字符。或者您可以根据需要存储整个字符串并使用第一个字符来获取答案。

编辑 2:冲洗不是解决此问题的方法。之前我提到过。 iharob 向我指出了这一点。您可以查看这两个答案以获得清晰的思路。

Flushing buffers in C

How to clear input buffer in C?

关于c - C 中的 Do-While 循环 - 打印时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30430082/

相关文章:

c - 如何只打印字符串的某些部分?

c - 为什么带有 %d 说明符的 printf 给出错误的结果?

C 代码陷入无限的 do-while 循环

java - 我的程序多了一个循环,如何解决?

c++ - 在运行时加载 DLL

c - 警告 : control reaches end of non void function

c - Chez Scheme 中的 FFI,用于具有可变参数的 C 函数(varargs)

c - 如何通过管道将 C 中定义的变量传递给 Gnuplot?

当在 C 中输入字符时代码循环

c - do while 循环中未声明的标识符,C