getchar的意外行为

时间:2013-02-02 18:40:31

标签: c do-while getchar

刚刚学习C编程,坚持我确信Do / While循环是微不足道的。我有一段代码需要用户点击'E'退出程序:

char exitletter;

do {
printf ("Please hit E to exit the Program\n");
exitletter = getchar();
} while (exitletter !='E');

但是,如果用户输入了错误的字符,则会打印两次“请按E退出程序”。如果用户输入say abcd,则会打印五次消息。

有人可以解释一下这里发生了什么吗?

2 个答案:

答案 0 :(得分:5)

这是因为在第一个getchar

期间输入的换行符

考虑您是按N然后按enter键来提供输入方式。实际上,您输入两个字符,一个是N,另一个是换行符(\n)。首先getchar将从N读取stdin,换行符字符将保留在stdin缓冲区中。现在它将打印出声明,然后它将尝试进入第二个getchar,那时它不会等你输入,因为stdin缓冲区中已有一个字符可用,所以它会读取该行然后它将使用E进行检查,此时循环也不会中断,它将打印statemnt,它将在第3 getchar等待用户输入输入。

如果向getchar提供输入的方式就像输入该字符并按Enter键意味着,请使用以下逻辑来帮助您摆脱此问题。

do {
    printf ("Please hit E to exit the Program\n");
    exitletter = getchar();
    while(exitletter == '\n')exitletter = getchar();
} while (exitletter !='E');

答案 1 :(得分:1)

虽然迟到了另一个答案:

您可以在阅读完角色后立即致电fflush

char exitletter;

    do {
        printf ("Please hit E to exit the Program\n");
        exitletter = getchar();
        fflush(stdin);
    } 
    while (exitletter !='E');

这会像你期望的那样奏效。