こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

c言語でint配列をdoubleに変換

c言語でマイコンプログラムを作成しています.
int型の配列をdoubleに変換するために以下のプログラムを記述し,テストしました.
int a[4] = {0,0,1,8};
char s[4];
double d;
char *temp;
sprintf(s,"%d%d%d%d",a[0],a[1],a[2],a[3]);
//文字列charをdoubleに変換
d = strtod(s,&temp);

望む結果は 18 ですが,なぜか上記結果は 1800 となりました.
試しに
int a[4] = {1,2,3,4};
と,1234と表示されました.
上記より,出力値が左詰めのようになっています.
試しにVisual Studio 2013 C++で同様のプログラムを実行すると,所望の結果を得ることが出来ました.
プログラムがおかしいのでしょうか?それともマイコンのコンパイラのバグでしょうか?
お分かりになられる方がいらっしゃいましたら,ご教授宜しくお願い致します.

投稿日時 - 2017-12-19 18:28:33

QNo.9409565

困ってます

質問者が選んだベストアンサー

> char s[4];
> sprintf(s,"%d%d%d%d",a[0],a[1],a[2],a[3]);

こういうケースだと一般的には sprintf() じゃなく snprintf() 使うんだが、
char s[5];
snprintf(s, sizeof(s), "%d%d%d%d",a[0],a[1],a[2],a[3]);

それかコスト的には
for (i = 0; i < 4; i++)
s[i] = a[i] % 10 + '0';
s[i] = '\0';
みたいにするか、そもそも strtod() 使う必然なければ直接
d = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
でいいんだが?
もちろん適時キャストしたりループ使ってもいいし、二桁以上あるなら対応するようにしてだけど。

投稿日時 - 2017-12-19 20:19:57

お礼

ご回答ありがとうございます.
snprintfはコンパイル時にリンクエラーが発生したため,使用しておりませんでした.コンパイルはマイコンのIDEで行っています.
皆様にご回答いただけるのを待っている間に
d = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
上記と同様のプログラムで所望の結果は出せたのですが,やはりなぜstrtodで左詰めになるのかが気になります.
皆様のアドバイスを反映させても直らないので,一度マイコンメーカーに問い合わせてみたいと考えます.

投稿日時 - 2017-12-19 20:27:52

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

プログラムがおかしいです。
Visual Studio 2013 C++では正常動作しているように見えてるだけです(本当は正常動作していないということ)

>char s[4];
>sprintf(s,"%d%d%d%d",a[0],a[1],a[2],a[3]);

sにNUL文字分の領域が確保されていませんのでバッファーオーバーランしてます。

投稿日時 - 2017-12-19 19:17:48

お礼

ご回答ありがとうございます.
char s[5]にして試行致しましたが,同じ結果になってしまいます.

投稿日時 - 2017-12-19 20:11:29

ANo.2

すいません、あと、やはり、ビッグエンディアンと、リトルエンディアンの違いかと思います

投稿日時 - 2017-12-19 19:04:16

お礼

ご回答ありがとうございます.
一度,桁が逆になっているのでは?と考え
sprintf(s,"%d%d%d%d",a[0],a[1],a[2],a[3]);

sprintf(s,"%d%d%d%d",a[3],a[2],a[1],a[0]);
にして試行しましたが,数値が逆になって左詰めになるだけでした.

投稿日時 - 2017-12-19 20:15:06

ANo.1

tempは、ポインタ型変数だけの宣言で、
領域は、確保してないので、
temp に mallocして、メモリ確保しないと、ngでは?

投稿日時 - 2017-12-19 19:01:43

お礼

ご回答ありがとうございます.
試しにmalloc処理を記述致しましたが,同じように左詰めで表示されます.
temp = (char*)malloc(sizeof(s));
d = strtod(s,&temp);
上記がテストコードです.

投稿日時 - 2017-12-19 19:19:41

あなたにオススメの質問