2017-03-28 14 views
0

は、私は次のコードで "11 + 3" 標準入力に供給され、第二のscanf()はを持っている必要があるので予期しない動作が

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)); 
} 

結果は私には奇妙に見えました失敗しました。参考までに、私はgcc 5.4.0 20160609をUbuntu 5.4.0-6ubuntu1〜16.04.4で使用しました。

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

なぜ失敗する必要がありますか? +3は、scanfが解析するための有効な数値です。 – StoryTeller

+0

@StoryTeller私はそれを期待していませんでした。 '+'と数字の間に空白がある場合はどうなりますか? 2番目の呼び出しはまだ機能する必要がありますか? – b1sub

+0

申し訳ありません。それから失敗するはずです。 scanfはホワイトスペース区切りの入力を読み取ります。 +と3は別々の "トークン"になりました。 – StoryTeller

答えて

0

第二のscanf()が失敗しているはずだから。

いいえ、あなたは完全に有効な入力を入力しました。

入力が満たされるまで、または区切り文字に達するまで、scanfは入力を解析します。

最初にscanfを呼び出すと、11という数字が11として解析され、次の数字は入力が満たされている数字の一部ではないため終了します。

scanfの2度目の呼び出しでは、整数形式の正の3の有効な式である、数値3として "+3"を解析します。負の数が3の場合は-3が返されます。

コメントに記載されているように、 "11+ 3"を渡すと2番目のscanfが失敗します。 "+"を整数(+の後の空白は区切り文字として数えられます)。