2017-03-28 99 views
0

我送入標準輸入 「11 + 3」 用下面的代碼,並與ungetc函數()意外的行爲

void main(void) { 
    int number; 
    printf("the first call : %d\n", scanf("%d", &number)); 
    char ch = fgetc(stdin); 
    ungetc(ch, stdin); 
    printf("the second call : %d\n", scanf("%d", &number)); 
} 

的結果似乎很奇怪,我因爲第二scanf()的應該有失敗。僅供參考,我在Ubuntu 5.4.0-6ubuntu1〜16.04.4下使用了gcc 5.4.0 20160609。

the first call : 1 
the second call : 1 
+6

爲什麼它應該失敗? +3是scanf解析的有效數字。 – StoryTeller

+0

@StoryTeller我沒想到。如果「+」和數字之間有空格,會怎麼樣?第二個電話應該還能工作嗎? – b1sub

+0

對不起。那麼它會失敗,是的。 scanf讀取whitesapce分隔的輸入。所以+和3現在是單獨的「令牌」。 – StoryTeller

回答

0

,因爲第二個scanf()的應該都失敗了。

不,你給它提供了完全有效的輸入。

scanf解析輸入,直到輸入滿意或直到碰到分隔符。

在您第一次調用scanf時,它將「11」解析爲數字11,然後結束,因爲下一位數字不是輸入滿足的數字的一部分。

在第二次調用scanf時,它將「+3」解析爲數字3,這是整數形式的正數3的有效表達式。正如「-3」對於負數3一樣。

正如在評論中提到的那樣,傳遞「11+ 3」會導致第二個scanf失敗,因爲它會試圖將「+」解析爲一個整數(+之後的空格作爲分隔符)。