web-dev-qa-db-ja.com

Cでstdioからintを取得する方法は?

これに重大な問題がある...

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

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

出力

> 1234
got the number: 1
26
maček

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

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

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

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

これを確認するには、次のようにscanfからのリターンコードをキャプチャします。

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

読み取り中にstdinでエラーが発生した場合、resultEOFになり、次のようなエラーを確認できます。

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

お役に立てれば!

[〜#〜] edit [〜#〜]:より詳細な質問に対する回答として、より適切な回答を示します。 :-)

このコードの問題は、書くときに

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

これは、scanfからの戻りコードを出力します。これは、ストリームエラーの場合はEOF、何も読み取られなかった場合は0、それ以外の場合は1です。これは、特に、整数を入力すると、scanfからステータスコードを印刷するため、読み取る番号ではないため、常に1を印刷することを意味します。

これを修正するには、これを

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

お役に立てれば!

52
templatetypedef

典型的な方法はscanfを使用することです:

int input_value;

scanf("%d", &input_value);
7
Jerry Coffin

解決策は非常に簡単です...あなたはgetchar()を読んでいるので、入力バッファの最初の文字を取得します.scanfは第二に、改行文字までバッファ全体を読み取ります。

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

出力

> [Prompt expecting input, lets write:] 1234 [Enter]
got the number: 1234
2
josegomezr