解決済み

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

  • 困ってます
  • 質問No.9409565
  • 閲覧数157
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 63% (188/297)

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++で同様のプログラムを実行すると,所望の結果を得ることが出来ました.
プログラムがおかしいのでしょうか?それともマイコンのコンパイラのバグでしょうか?
お分かりになられる方がいらっしゃいましたら,ご教授宜しくお願い致します.

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

  • 回答No.4

ベストアンサー率 62% (260/415)

> 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];
でいいんだが?
もちろん適時キャストしたりループ使ってもいいし、二桁以上あるなら対応するようにしてだけど。
お礼コメント
con014057

お礼率 63% (188/297)

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

その他の回答 (全3件)

  • 回答No.3

ベストアンサー率 28% (1336/4690)

コンピューター カテゴリマスター
プログラムがおかしいです。
Visual Studio 2013 C++では正常動作しているように見えてるだけです(本当は正常動作していないということ)

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

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

お礼率 63% (188/297)

ご回答ありがとうございます.
char s[5]にして試行致しましたが,同じ結果になってしまいます.
投稿日時 - 2017-12-19 20:11:29
  • 回答No.2

ベストアンサー率 25% (1/4)

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

お礼率 63% (188/297)

ご回答ありがとうございます.
一度,桁が逆になっているのでは?と考え
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
  • 回答No.1

ベストアンサー率 25% (1/4)

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

お礼率 63% (188/297)

ご回答ありがとうございます.
試しにmalloc処理を記述致しましたが,同じように左詰めで表示されます.
temp = (char*)malloc(sizeof(s));
d = strtod(s,&temp);
上記がテストコードです.
投稿日時 - 2017-12-19 19:19:41
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集

ピックアップ

ページ先頭へ