2010-09-04 87 views
10

我通过一段代码在我学习的功能发现困惑:Ç的getchar VS scanf函数

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

回答

8

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

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

它可能会更清楚,如果scanf函数与

command = getchar(); 

取代,但它实际上是一个一般坏榜样,因为它没有处理完文件的好。

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

+0

OHHHH,我不知道getchar删除了输入缓冲区中的下一个字符 - 这解释了我的困惑。谢谢。 – startuprob 2010-09-04 02:54:14

2

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

Flush函数的功能是读取直到遇到换行符(\n)。这是用户点击回车键时产生的角色。因此,你给出的代码将会读取一个字符(我不清楚它为什么使用scanf而不是简单的getchar,这会更快),然后丢弃其余的输入,直到用户点击输入。

如果您要喂养此程序foobar,则需要f并丢弃Flush函数中的oobar。在不致电flush的情况下,f可能会转到一个scanf,而第二个scanf会得到第一个o

+0

我还是不明白。什么是Flush在做什么?它似乎相当于一个if语句条件,但不是命令。我知道scanf会保存所有的用户输入,然后再次运行它,但是Flush如何防止它在您的示例中运行'o'? – startuprob 2010-09-04 02:49:27

-1

下面的代码示例可以帮助你找出背后的逻辑使用Flush()

std::cerr << "Save this data (y for yes/Enter for no)? "; 
int chr = getchar(); 
if(chr != '\n') while(getchar() != '\n'); // Flush() 
if(chr == 'y') 
    std::cerr << "The current data was saved\n";