C getchar vs scanf

在我正在研究的函数中发现的一段代码让我感到困惑:

char GetCommand( void ) { char command; do { printf( "Enter command (q=quit, n=new, l=list): " ); scanf( "%c", &command ); Flush(); } while ( (command != 'q') && (command != 'n') && (command != 'l') ); printf( "\n----------\n" ); return( command ); } void Flush( void ) { while ( getchar() != '\n' ) ; } 

我在这里不太明白的是Flush()函数的用法。 我的意思是,我正在阅读的书通过说它阻止用户输入多个单个字符然后在第二次提示输入时读取该字符来解释它。

我不明白的是Flush()是如何防止这种情况发生的。 它什么都不做。 它只是一个while命令。 (虽然这是真的……什么?????)没有意义。

getchar()具有从输入缓冲区中删除下一个字符的副作用。 Flush的循环读取并丢弃字符,直到 – 并包括 – 换行符结束行。

由于scanf被告知只读取一个字符( %c ),因此忽略了该输入行上的所有其他字符。

如果替换scanf可能会更清楚

 command = getchar(); 

但它实际上是一个很糟糕的例子,因为它不能很好地处理文件结束。

一般来说,最好忘记scanf ; fgetssscanf工作得更好,因为一个负责获取输入,另一个负责解析它。 scanf (和fscanf )尝试一次做太多工作。

getchar从标准输入中读取一个字符。 如果你把它放在while循环中,它将继续一次读取一个字符,直到条件为false。

Flushfunction正在做的是读取直到它遇到换行符( \n )。 这是用户点击回车键时产生的字符。

所以,你提供的代码将读取一个字符(我不清楚为什么它使用scanf而不是简单的getchar ,这将更快),然后丢弃其余的输入,直到用户点击进入。

如果您要将此程序输入foobar ,则需要f并在Flushfunction中丢弃oobar 。 如果不调用flushf可以转到一个scanf ,第二个scanf会得到第一个o