31

これには重大な問題があります...

printf("> ");
int x = getchar();

printf("got the number: %d", scanf("%d", &x));

出力

> 1234
got the number: 1
4

3 に答える 3

68

これがあなたが探しているものかどうかは完全にはわかりませんが、質問が を使用して整数を読み取る方法である場合<stdio.h>、適切な構文は次のとおりです。

int myInt;
scanf("%d", &myInt);

もちろん、これが正しく機能することを確認するには、多くのエラー処理を行う必要がありますが、これは良い出発点になるはずです。特に、次のような場合を処理する必要があります。

  1. stdinファイルが閉じられているか壊れているため、何も得られません。
  2. ユーザーが無効なものを入力しました。

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なっているからのリターン コードを出力しています。これは、特に整数を入力した場合、読み取った数値ではなくからステータス コードを出力しているため、これは常に出力されることを意味します。EOF011scanf

これを修正するには、これを次のように変更します

int x;
scanf("%d", &x);
/* ... error checking as above ... */
printf("got the number: %d", x);

お役に立てれば!

于 2011-02-23T04:43:47.793 に答える
7

典型的な方法は次のscanfとおりです。

int input_value;

scanf("%d", &input_value);

ただし、ほとんどの場合、入力の読み取りが成功したかどうかを確認する必要があります。scanfは正常に変換されたアイテムの数を返すため、通常は戻り値を、読み取ると予想されるアイテムの数と比較します。この場合、1 つの項目を読み取ることを期待しているので、次のようになります。

if (scanf("%d", &input_value) == 1)
    // it succeeded
else
    // it failed

もちろん、同じことがすべてのscanfファミリ (sscanfなどfscanf) にも当てはまります。

于 2011-02-23T04:43:07.920 に答える
3

解決策は非常に簡単です...入力バッファの最初の文字を与える getchar() を読んでいます.次に、改行文字までバッファ全体を読み取ります。

printf("> ");
int x;
scanf("%d", &x);
printf("got the number: %d", x);

出力

> [prompt expecting input, lets write:] 1234 [Enter]
got the number: 1234
于 2013-10-18T01:18:46.807 に答える