C getchar vs scanf

时间:2010-09-04 02:02:08

标签: c scanf getchar

我对正在学习的函数中找到的一段代码感到困惑:

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

3 个答案:

答案 0 :(得分:10)

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

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

如果用

替换scanf可能会更清楚
command = getchar();

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

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

答案 1 :(得分:4)

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

Flush函数正在执行的操作是读取直到遇到换行符(\n)。这是用户点击回车键时产生的字符。

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

如果您要提供此计划foobar,则需要f并放弃oobar功能中的Flush。在不调用flush的情况下,f可以转到一个scanf,第二个scanf会获得第一个o

答案 2 :(得分:0)

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