3

注: この質問は非常に単純ですが、Google で検索しても明確な説明がありません。

私は次のプログラムを持っています

int main()
{
 float c;
 scanf("%f",&c);
 printf("%f",c);
}

o/pint値を指定すると (例: - 9)、9.000000 と表示されます。

しかし、「a」のようなchar値を与えているとき、それは表示されておらず、0.000000を示してmemory representation of floatいます.表示されません。intint value (9)char (a)

それがどのように起こっているか。char割り当て中のメモリ表現は何ですか。

4

3 に答える 3

10

charコードのどこにも sがないことに注意してください。

これが機能するはずscanfの方法です。からの戻り値を確認すると(そうあるべきです!)、おそらく 0 が返されていることがわかります。これは、アイテムが一致しなかったことを意味します。scanf

書式文字列を指定scanf()すると、それは「浮動小数点"%f"数を取得してほしい」という意味です。「a」のような入力を提供すると、有効な浮動小数点数ではないため、何にも一致しません。'a'

http://www.cplusplus.com/reference/cstdio/scanf/

于 2013-07-16T05:39:34.593 に答える
4

まず、通常、printfフォーマット文字列を改行\nまたは else callで終了する必要がありますfflush

scanf次に、 man ページscanf(3)のドキュメントを読む必要があります。

失敗する可能性があり、成功した一致の数を返します。

戻り値

これらの関数は、正常に一致して割り当てられた入力項目の数を返します。これは、提供された数より少ないか、初期の一致に失敗した場合はゼロになることもあります。

最初の変換の成功または一致の失敗が発生する前に入力の終わりに達した場合、値 EOF が返されます。読み取りエラーが発生した場合にも EOF が返されます。この場合、ストリームのエラー インジケータ (ferror(3) を参照) が設定され、エラーを示す errno が設定されます。

変換指定aに対して入力文字を入力すると、エラーが発生します。%fあなたの場合、c変数は変更されていません(つまり、「初期化されていません」)。

の結果をテストする必要がありますscanf<=0あなたの場合は失敗しています)。

于 2013-07-16T05:40:40.190 に答える
1

scanfあなたが書いたフォームでは、最初の非数値文字 (改行、スペース、任意の文字) まで数字 ( int/ )を見つけて読み取ろうとします。float文字はints ですが、これはscanfとその動作方法によるものです。ドキュメントを読んでください。

于 2013-07-16T05:39:54.720 に答える