12

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

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命令。(虽然这是真的......什么?????)没有意义。

4

3 回答 3

11

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

由于scanf被告知读取一个且仅一个字符 ( %c),因此具有忽略该输入行上其他所有内容的效果。

如果将 scanf 替换为

command = getchar();

但它实际上是一个通常不好的例子,因为它不能很好地处理 End Of File。

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

于 2010-09-04T02:09:17.293 回答
4

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

Flush函数所做的是读取直到遇到换行符 ( \n)。这是用户按下回车键时产生的字符。

因此,您提供的代码将读取一个字符(我不清楚为什么它scanf用于此而不是简单的getchar,这会更快),然后丢弃其余输入,直到用户按 Enter 键。

如果你要喂这个程序foobar,它会接受f并丢弃函数oobar中的Flush。没有调用flushf可以去一个scanf,第二个scanf会得到第一个o

于 2010-09-04T02:07:25.277 回答
0

当您输入字符并按 Enter 时,按 Enter 键会生成一个换行符,并保留在缓冲区中。这是有问题的,因为它会一直等到您下一次需要用户输入时才会用于该输入。Flush 用于从输入缓冲区中刷新换行符,因此您不会遇到该问题。Flush 在读取时实际上使用了输入缓冲区中的换行符并被丢弃,因此它不再在缓冲区中。

于 2018-12-03T01:44:33.627 回答