C getchar vs scanf

sta*_*rob 12 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' )
        ;
}
Run Code Online (Sandbox Code Playgroud)

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

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

msw*_*msw 11

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

由于scanf被告知要读取一个且只有一个字符(%c),这会忽略该输入行上的所有其他内容.

如果替换scanf可能会更清楚

command = getchar();
Run Code Online (Sandbox Code Playgroud)

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

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