回答:
"%f"
doubleの(または少なくとも1つの)正しい形式です。ありませんのためのフォーマットはfloat
あなたが合格しようとした場合ので、float
にprintf
、それはに昇格することがありますdouble
前にprintf
、それを受信1。"%lf"
現在の標準でも許容l
されます-は、f
変換指定子が続く場合(特に)、効果がないと指定されています。
これは、printf
フォーマット文字列がフォーマット文字列scanf
(およびfscanf
など)と大幅に異なる1つの場所であることに注意してください。出力の場合、値を渡します。可変パラメーターとして渡されると、からfloat
に昇格しdouble
ます。入力の場合は、昇格されていないポインターを渡すのでscanf
、a float
またはa のどちらを読みたいかを伝える必要がありますdouble
。したがって、forはscanf
、%f
aを読みたいことfloat
を%lf
意味し、a double
(および、価値は、のためにlong double
、使用%Lf
のいずれかのためprintf
かscanf
)。
1. C99、§6.5.2.2/ 6:「呼び出された関数を表す式にプロトタイプを含まない型がある場合、整数の昇格が各引数で実行され、型がfloatの引数が倍に昇格されます。これらはデフォルトの引数プロモーションと呼ばれます。」C ++では表現が多少異なります(たとえば、「プロトタイプ」という単語は使用されません)が、効果は同じです。すべての可変パラメータは、関数が受け取る前にデフォルトのプロモーションを受けます。
g++
不良品%lf
でコンパイル-Wall -Werror -pedantic
:error: ISO C++ does not support the ‘%lf’ gnu_printf format
l
は拡張機能でした。C99 / 11およびC ++ 11標準では、それを可能にする実装が必要です。
scanf
ない希望double
Sで表される%lf
:それはそれは期待と文句を言いfloat *
、見つかったdouble *
だけで%f
。
scanf
ので、それが読み何を保存する場所へのポインタを取る必要があり、一方、スペースが尖っ-にされているどのように大きな知っているprintf
「デフォルト引数のプロモーションが」として両端を平均値そのものをとり、そしてdouble
ので、S l
であります基本的にオプションです。
与えられたC99の標準(すなわち、N1256用のfprintf(のprintf、sprintfの、...)やscanf関数:ドラフト)、ルールは、関数の種類によって異なります。
抽出された関連パーツは次のとおりです。
序文
この第2版は、ISO / IEC 9899 / COR1:1994、ISO / IEC 9899 / AMD1:1995、およびISO / IEC 9899 / COR2:1996によって修正および修正された、第1版のISO / IEC 9899:1990を取り消して置き換えます。前版からの主な変更点は次のとおりです。
%lf
で使用できる変換指定子printf
7.19.6.1
fprintf
関数7長さ修飾子とその意味は次のとおりです。
l(エル)(...)が後続のa、A、e、E、f、F、g、またはG変換指定子に影響しないことを指定します。
L次のa、A、e、E、f、F、g、またはG変換指定子がlong double引数に適用されることを指定します。
に指定されたものと同じルールfprintf
がprintf
、sprintf
および同様の関数に適用されます。
7.19.6.2
fscanf
関数11長さ修飾子とその意味は次のとおりです。
l(エル)次のa、A、e、E、f、F、g、またはG変換指定子が、タイプポインターがdoubleの引数に適用されることを指定します(...)。
L次のa、A、e、E、f、F、g、またはG変換指定子がlong doubleへの型ポインターを持つ引数に適用されることを指定します。
12変換指定子とその意味は次のとおりです。a、e、f、gオプションで符号付きの浮動小数点数と一致します(...)
14変換指定子A、E、F、G、およびXも有効であり、それぞれ、a、e、f、g、およびxと同じように動作します。
fprintf
次の指定子と対応するタイプが指定されているため、簡単に言えば、
%f
->ダブル%Lf
->ロングダブル。そしてfscanf
それは:
%f
->フロート%lf
->ダブル%Lf
->ロングダブル。それは%f
、%g
または%e
数値をどのようにフォーマットするかによって異なります。詳細はこちらをご覧ください。l
修飾子はで必要とされるscanf
とdouble
、しかし、NOT IN printf
。
l
小文字)修飾子は整数型(cplusplus.com/reference/clibrary/cstdio/printf)用でありL
、浮動小数点型用です。さらに、L
修飾子はlong double
プレーンではなくを期待しdouble
ます。
l
必要ではないことを私は言ったことはありません。printf
double
形式%lf
は、使用したとおりのの完全に正しいprintf
形式ですdouble
。コードに問題はありません。
形式%lf
in printf
は、C言語の古い(C99より前の)バージョンではサポートされていなかったためdouble
、in printf
との形式指定子間に表面的な「矛盾」が生じていましたscanf
。その表面的な矛盾はC99で修正されました。
あなたが使用する必要はありません%lf
とdouble
の中でprintf
。%f
必要に応じて使用することもできます(%lf
およびと%f
同等ですprintf
)。しかし、現代のCにそれが使用することを好むために完璧な理にかなっている%f
とfloat
、%lf
とdouble
と%Lf
とlong double
一貫の両方で、printf
とscanf
。
scanf()
、"%f"
、"%lf"
一致しfloat *, double *
ていない、float, double
として最後の行で暗示。
%Lf
(大文字に注意L
)はlong doubleの形式指定子です。
平野のためにdoubles
どちらかの、%e
、%E
、%f
、%g
または%G
行います。
%g
とは%G
?
"%lf"
は未定義です。C99およびC11ライブラリでは、と同じであると定義されています"%f"
。