これには重大な問題があります...
printf("> ");
int x = getchar();
printf("got the number: %d", scanf("%d", &x));
出力
> 1234
got the number: 1
これがあなたが探しているものかどうかは完全にはわかりませんが、質問が を使用して整数を読み取る方法である場合<stdio.h>
、適切な構文は次のとおりです。
int myInt;
scanf("%d", &myInt);
もちろん、これが正しく機能することを確認するには、多くのエラー処理を行う必要がありますが、これは良い出発点になるはずです。特に、次のような場合を処理する必要があります。
stdin
ファイルが閉じられているか壊れているため、何も得られません。scanf
これを確認するには、次のようなリターン コードを取得します。
int result = scanf("%d", &myInt);
stdin
読み取り中にエラーが発生した場合は にresult
なりEOF
ます。次のようなエラーを確認できます。
int myInt;
int result = scanf("%d", &myInt);
if (result == EOF) {
/* ... you're not going to get any input ... */
}
一方、ユーザーがゴミのテキスト文字列などの無効なものをstdin
入力した場合は、問題のある入力をすべて消費するまで文字を読み取る必要があります。scanf
何も読み取られなかった場合に 0 を返すという事実を使用して、次のようにこれを行うことができます。
int myInt;
int result = scanf("%d", &myInt);
if (result == EOF) {
/* ... you're not going to get any input ... */
}
if (result == 0) {
while (fgetc(stdin) != '\n') // Read until a newline is found
;
}
お役に立てれば!
編集:より詳細な質問への回答として、より適切な回答があります。:-)
このコードの問題は、
printf("got the number: %d", scanf("%d", &x));
これは、何も読み取られなかった場合、およびそうでない場合に、ストリーム エラーにscanf
なっているからのリターン コードを出力しています。これは、特に整数を入力した場合、読み取った数値ではなくからステータス コードを出力しているため、これは常に出力されることを意味します。EOF
0
1
1
scanf
これを修正するには、これを次のように変更します
int x;
scanf("%d", &x);
/* ... error checking as above ... */
printf("got the number: %d", x);
お役に立てれば!
典型的な方法は次のscanf
とおりです。
int input_value;
scanf("%d", &input_value);
ただし、ほとんどの場合、入力の読み取りが成功したかどうかを確認する必要があります。scanf
は正常に変換されたアイテムの数を返すため、通常は戻り値を、読み取ると予想されるアイテムの数と比較します。この場合、1 つの項目を読み取ることを期待しているので、次のようになります。
if (scanf("%d", &input_value) == 1)
// it succeeded
else
// it failed
もちろん、同じことがすべてのscanf
ファミリ (sscanf
などfscanf
) にも当てはまります。
解決策は非常に簡単です...入力バッファの最初の文字を与える getchar() を読んでいます.次に、改行文字までバッファ全体を読み取ります。
printf("> ");
int x;
scanf("%d", &x);
printf("got the number: %d", x);
> [prompt expecting input, lets write:] 1234 [Enter]
got the number: 1234