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

时间:2015-05-25 01:18:01

标签: 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吗?为什么?

谢谢!

2 个答案:

答案 0 :(得分: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');
}

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

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

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

Flushing buffers in C

How to clear input buffer in C?

答案 1 :(得分:0)

要制作代码robuts,即它可以使用任何输入,您可能需要读取您不认为有效的所有字符,包括按Enter键时发送的'\n'并刷新输入缓冲区,这是使用fflush()无法做到的,因为它只是为输出缓冲区定义,你还应该考虑空行的情况,即当用户按下 Enter 立即,以下代码完成了我所描述的所有内容

#include <stdio.h>
#include <stdbool.h>

bool
adult()
{
    char answer;
    do {
        int chr;

        printf("Are you an adult? [y/n] ");
        answer = getchar();
        if (answer == '\n')
            continue;
        while (((chr = getchar()) != EOF) && (chr != '\n'));
    } while (!(answer == 'y' || answer == 'n'));

    return (answer == 'y');
}