C getchar与scanf的区别

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

3个回答

11

getchar()有副作用,会从输入缓冲区中移除下一个字符。在Flush循环中,读取并丢弃字符直到换行符\n结束整行。

由于scanf只被告知读取一个字符(%c),这就导致忽略了该输入行上的其他任何内容。

如果将scanf替换为以下内容,则可能更清晰:

command = getchar();

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

一般来说,最好遗忘scanffgetssscanf工作得更好,因为一个负责获取输入,另一个负责解析它。scanf(以及fscanf)试图同时执行太多任务。


哦,我不知道 getchar 会删除输入缓冲区中的下一个字符 - 这解释了我的困惑。谢谢。 - startuprob

4

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

Flush函数的作用是读取直到遇到换行符(\n)。当用户按下回车键时,就会产生这个字符。

因此,您提供的代码将读取一个字符(我不清楚为什么要使用scanf而不是更快的getchar),然后丢弃剩余的输入,直到用户按下回车键。

如果您向该程序输入foobar,它将获取f并丢弃Flush函数中的oobar。如果没有调用flush函数,则f可能会传递给一个scanf,第二个scanf将获取第一个o


我仍然不理解。Flush到底是做什么的?它似乎相当于if语句的条件,但不是命令。我知道scanf会保存所有用户输入,然后再次运行它,但Flush如何防止在你的示例中运行“o”? - startuprob

0
当您输入字符并按下Enter键时,您按下Enter键会生成一个换行符,并保留在缓冲区中。这是有问题的,因为它会等待下一次需要用户输入的时间,并用于该输入。Flush用于清除输入缓冲区中的换行符,以便您不会遇到该问题。Flush实际上在读取输入缓冲区中的换行符时使用它,并将其丢弃,因此它不再在缓冲区中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接