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

pav*_*163 0 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');
}
Run Code Online (Sandbox Code Playgroud)

我的目标是,如果答案既不是y,那么问题应该重复.但这似乎有一个错误:

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

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

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

谢谢!

use*_*738 5

实际上答案中的额外'\n'是(是)y或(否)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');
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里查看我的其他答案.你会得到一个清晰的想法. getchar()和scanf中的输入缓冲区

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

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

在C中刷新缓冲区

如何清除C中的输入缓冲区?