C getchar 与 scanf

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

最佳答案

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

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

如果把scanf换成

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

但这实际上是一个普遍不好的例子,因为它不能很好地处理文件结尾。

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

关于C getchar 与 scanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3640604/

相关文章:

C 编程 - K&R 示例 1.5.2 - 修改后的程序未按预期运行

c++ - 为什么 sizeof 运算符对数组产生不同的结果

c - 在 C 中使用数组索引的 scanf

c 语言 scanf - fflush(stdin) - 不起作用

c - 通过 getchar 和 putchar 打印多行

c - 这个二维字符数组的字符输入有什么问题?为什么它不接受 K*K 输入的总数?

c - C中的指针数组和结构体

c++ - 对于客户端服务器程序,并行接收多个客户端连接请求的最佳方法是什么?

c++ - C/C++ 语法 - 使用 , 而不是 ; 分隔语句合法的?

c - wscanf() 在获取输入时的行为与 scanf() 不同