2010-09-04 92 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";