2013-02-02 26 views
1

刚刚学习C编程,并坚持我确信的是Do/While循环的一些微不足道的事情。我有一个代码块,要求用户打“E”退出程序:getchar的意外行为

char exitletter; 

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

然而,如果用户输入了不正确的字符,它打印“请按E退出计划”的两倍。如果用户输入说abcd,它会打印该消息五次。

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

+0

处理'exitletter'为'\ n'的情况。 – cnicutar

+1

要输入程序,用户输入一个字母并输入,换行符会保留在输入缓冲区中,以便在第二轮中立即读取。 –

+0

另外,由“返回”按钮产生的换行符是一个字符,所以它由'getchar()'报告。 –

回答

1

一个不同的答案,虽然晚:

你可以读取字符后立即呼吁fflush

char exitletter; 

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

并且这会像你期望的那样工作。

5

这是因为,在第一getchar

进入考虑一下,如果您按N,然后按enter键给输入装置,换行字符。实际上你输入的是两个字符,一个是N,另一个是换行符(\n)。首先getchar将从stdin中读取N,并且换行符保留在stdin缓冲区中。现在它会打印这条消息,然后它会尝试去第二个getchar那个时候它不会等你输入,因为一个字符已经在stdin缓冲区中可用,所以它会读取换行符,然后它会检查E ,这一次循环也不会中断,它将打印statemnt,它将在第3个getchar中等待用户输入输入。

如果给getchar提供输入的方式就像输入该字符并按回车键一样,使用下面的逻辑可以帮助你摆脱这个问题。

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

更新了示例代码片段。你必须有这样的逻辑。 – rashok

+0

这很好用!我怎么能摆脱用户输入多个字符的问题,以及每超出一次输入一次的消息? – flash1821

+0

用户必须输入一个字符和'输入'键。如果用户输入的字符超过1个,那么编写一个循环逻辑来解析,直到'\ n'并处理该情况。 – rashok