質問

正しい形式の仕様は何ですか double printfで?それは...ですか %f またはそれは %lf?そうだと思います %f, 、しかし、私はよくわかりません。

コードサンプル

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}
役に立ちましたか?

解決

"%f" ダブルの正しい形式(または少なくとも1つ)です。三 aの形式はありません float, 、aを渡そうとした場合 floatprintf, 、昇進します doubleprintf それを受け取ります1. "%lf" また、現在の標準でも受け入れられます l フォローしている場合、効果がないと指定されています f 変換仕様(とりわけ)。

これが1つの場所であることに注意してください printf フォーマット文字列は大きく異なります scanf (と fscanf, など)フォーマット文字列。出力の場合、あなたはaを渡します 価値, 、それは昇進します floatdouble バリアードパラメーターとして渡された場合。入力については、渡します ポインター, 、宣伝されていないので、あなたは伝えなければなりません scanf 読みたいかどうか float またはa double, 、だから scanf, %f あなたが読みたいという意味です float%lf あなたが読みたいという意味です double (そして、それが価値があることのために、 long double, 、 あなたが使う %Lf どちらか printf また scanf).


1. C99、§6.5.2.2/6:「呼び出された関数を示す式にプロトタイプを含まないタイプを持っている場合、整数プロモーションは各引数で実行され、タイプのフロートがある引数は2倍に宣伝されます。これらはデフォルトの引数プロモーションと呼ばれます。」 C ++では、文言は多少異なります(例えば、「プロトタイプ」という単語を使用しません)が、効果は同じです。すべてのバリアードパラメーターは、関数が受信する前にデフォルトのプロモーションを受けます。

他のヒント

与えられた C99 標準(すなわち、 N1256 ドラフト)、ルールは関数の種類に依存します:fprintf(printf、sprintf、...)またはscanf。

ここに関連するパーツが抽出されます。

序文

この第2版は、ISO/IEC 9899/COR1:1994、ISO/IEC 9899/AMD1:1995、およびISO/IEC 9899/COR2:1996:ISO/IEC 9899/Cor1によって修正および修正された第1版ISO/IEC 9899:1990をキャンセルおよび置き換えます。以前の版からの主要な変更には次のものがあります。

  • %lf 許可される変換仕様 printf

7.19.6.1 fprintf 働き

7 長さの修飾子とその意味は次のとおりです。

l (ELL)は、(...)が次のA、a、e、e、f、f、g、またはg変換仕様に影響を与えないことを指定します。

l 次のa、a、e、e、f、g、またはg変換指定子が長い二重引数に適用されることを指定します。

同じルールが指定されています fprintf 申請する printf, sprintf 同様の機能。

7.19.6.2 fscanf 働き

11 長さの修飾子とその意味は次のとおりです。

l (ELL)は、次のA、e、e、e、f、f、g、またはg変換仕様がタイプポインターを持つ引数に適用されることを(...)指定します。

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 修飾子が必要です scanfdouble, 、ではありません printf.

正しい printf のフォーマット double%lf, 、まさにあなたがそれを使用したように。あなたのコードには何の問題もありません。

フォーマット %lfprintf 古い(PRE-C99)バージョンのC言語ではサポートされていませんでした。 doubleprintfscanf. 。その表面的な矛盾はC99で修正されています。

したがって、現代Cでは、使用することを好むのは完全に理にかなっています %ffloat, %lfdouble%Lflong double 両方で一貫して printfscanf.

%Lf (首都に注意してください L) それは フォーマット仕様 にとって 長いダブル.

平野のために doubles, 、 また %e, %E, %f, %g また %G しましょう。

ダブルの場合、単に使用できます %lf または、好みに応じてフォローを使用できます

%e また %E 指数形式の値の場合

%g また %G 通常の表記法または指数表記のいずれかについて、その大きさに適した方がいずれの方も。

こちらをご覧ください cのすべてのフォーマット仕様のリスト

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top