質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

38987閲覧

C言語でdouble型の配列に格納した数字がうまく表示されない

tada_tadaa

総合スコア111

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/01/08 05:43

c言語のdouble型の配列にforループで数値を入力
して、それをそのままforループで出力表示する
プログラムを作成しているのですが、出力される値が
変な値になってしまいます。
入力と出力の例を下記にペーストしときます。

浮動小数点数を入力してください:2.2
浮動小数点数を入力してください:2.4
浮動小数点数を入力してください:2.5
61424280716611353000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000.000000
0.000000
61427303651391640000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000.000000

ちなみに、double型をint型にして、scanf関数とprint
f関数をint型を出力するように変更させるとうまくいき
す。下記にその時の実行結果をペーストします。

浮動小数点数を入力してください:2
浮動小数点数を入力してください:3
浮動小数点数を入力してください:4
2
3
4

コードは以下になります。初歩的な質問ですが何卒
よろしくお願いいたします。

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int i, j; 6 double d[10]; 7 //int d[10]; 8 9 for(i=0; i<3; i++){ 10 printf("浮動小数点数を入力してください:"); 11 scanf("%f",&d[i]); 12 } 13 14 for(j=0; j<3; j++){ 15 printf("%f\n", d[j]); 16 } 17 18 return 0; 19}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

scanf() の書式指定文字列を %lf にする必要があります。

scanf() の書式指定では、floatなら%f、doubleなら%lfを指定する必要があります。
floatは4バイト、doubleは8バイトデータなので、このように明示的に異なる書式指定を行います。

一方、printf() の場合、floatもdoubleも%fを指定します。printf()の引数にfloatが渡されるとコンパイラによって暗黙的にdoubleに変換されるので、%fでOKなのです。

ただし、scanf()とprintf()のfloatの取り扱い方法の違いから起こる混乱を解消するために、C言語のC99という改訂版でprintf()で%fと%lfを明示的に使い分けてもよいことになりました。

投稿2016/01/08 06:04

tkanda

総合スコア2425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tada_tadaa

2016/01/08 06:42

丁寧なご回答ありがとうございます。 わかりやすい説明で脳が整理されました。 しばらくは忘れずにすみそうです。 ありがとうございました。
guest

0

こんにちは。

scanf()の書式指定子は、%fはfloat, %lfはdoubleです。
printf()の書式指定子は、%fでdoubleです。printf()の場合、float型変数はコンパイラによりdoubleへ変換して渡されるためfloat用の書式指定子はありません。

この分かりにくさはC言語標準ライブラリの黒歴史かも

投稿2016/01/08 05:53

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tada_tadaa

2016/01/08 06:34

ご回答ありがとうございます。 %fでfloatもdoubleもOKだと思いこんでました。 まだ日が浅いのでこのあたりがややこしいと思ってましたが、今日の質問でしばらくは このあたりのことを忘れずにすみそうです。 ありがとうございました。
Chironian

2016/01/08 06:56

> %fでfloatもdoubleもOKだと思いこんでました。 printf()はその通りですね。こちらは変数の値を渡してます。そして、コンパイラの仕様でfloatでもdoubleへ変換して渡されるので、printf()関数はdoubleとして処理するだけで良いのです。 しかし、scanf()の場合は、変数へのポインタを渡してます。なので、その変数の型をscanf()関数が把握して適切に格納しないとおかしなことになります。変数の型をscanf()関数に教える役割を書式指定子が担っています。 その点、C++のiostreamは便利ですよ。書式指定不要なので型指定ミスすることがまずないですから。(逆に、書式を指定したい時は少し面倒ですけどね。)
guest

0

ベストアンサー

scanf("%lf",&d[i]);です
%fじゃないです。これだとfloatです

投稿2016/01/08 05:48

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tada_tadaa

2016/01/08 06:16

たしかに%lfでうまく動きました。%lfやら%fやら似ていて覚えにくいですね。 ご回答ありがとうございました。
ozwk

2016/01/08 06:34

long floatとfloatの略です
guest

0

printf("%f\n", d[j]); を

printf("%lf\n", d[j]);

にしたらどうでしょうか

投稿2016/01/08 05:47

Toyoshima

総合スコア422

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tada_tadaa

2016/01/08 06:23

ご回答ありがとうございます。 ほかの方がおっしゃってる通り、scanf関数の書式指定子に%lfを指定するとうまくいきました。 printf関数の書式指定子は%fでも%lfでも問題なく表示されました。 つまり問題はscanf関数の書式指定子にあったわけです。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問