web-dev-qa-db-ja.com

Cでscanfを使用してdouble値を読み取る

Cでscanf()を使用して2つの値を読み取ろうとしましたが、システムがメモリに書き込む値が入力した値と等しくありません。コードは次のとおりです。

double a,b;
printf("--------\n"); //seperate lines
scanf("%ld",&a);
printf("--------\n"); 
scanf("%ld",&b);
printf("%d %d",a,b);

1と2を入力した場合、CMDは正しい値を返しますが、b = -858993460ここで既に試したことです。doubleの代わりにfloatまたはintを使用し、scanf_sを使用し、scanf( "%dまたはまたは%lfまたは%eまたは%g)、fflush(stdin)を使用してキーボードバッファーをクリアし、bを最初に読み取り、すべての可能な組み合わせを試します。32ビットOSのdoubleの長さに問題があることがわかりました。そのため、scanf( "%lf"、&f)を使用して強制的にdoubleを読み取るようにします。私が何をしても、2番目の値は常に間違っています。

Windows 7 32ビットOSでデスクトップ用MS VS Express 2012を使用します。

36
user1880009

%lf形式指定子を使用して、doubleを読み取ります。

double a;
scanf("%lf",&a);

ウィキペディアには、利用可能な形式指定子用の 適切な参照 があります。

%lf形式指定子を使用して、結果も出力する必要があります。

printf("%lf %lf",a,b);
73
simonc

私が知る限り、%dは10進数を意味し、小数点のない数字です。 double値をロードする場合は、%lf変換(long float)を使用します。 printfの場合、同じ理由で値が間違っています。%dは整数(および、何をしているのかを知っている場合は文字)にのみ使用されます。

例:

double a,b;
printf("--------\n"); //seperate lines
scanf("%lf",&a);
printf("--------\n"); 
scanf("%lf",&b);
printf("%lf %lf",a,b);
6
Kyborek

doubleに間違ったフォーマットシーケンスを使用しています。%lfの代わりに%ldを使用する必要があります。

double a;
scanf("%lf",&a);
3
piokuc

printfのデータ型は最終的にdoubl内のfloatデータ型に変換されるため、doubleの書式指定子はprintfデータ型の%fでなければなりません。

floatデータを印刷する規定はありません。ここでの議論を見つけてください: printfのdoubleの正しい書式指定子

1
Biswajit Roy

%lfを使用すると、この問題の解決に役立ちます。

つかいます :

scanf("%lf",&doub)
0
Akshansh