• ベストアンサー

■int型の数値から数字文字への変換について

はじめまして。専門学生のhide1978と申します。 今回、以下のような問題に取り組んでいるのですが、どうしても正しい結果が得られません。どなたか知恵を授けてやってください。よろしくお願いいたします。 ■問題 int型の数値(-32767から32767)を入力して、そのまま10進文字列(char型)として変換する。 ■私が書いたプログラム #include <stdio.h> int NUMtoCHAR(int c){ if(c >= 0 && c <= 9) return (c+'0'); else return c; } void main(void){ signed int i_value; int count, i; double f_value; char c[9]; printf("入力データ:");scanf("%d",&i_value); printf("\n"); for(i = 0; i < 9; i++) c[i] = ' '; if(i_value > 0){ c[0] = '+'; }else if(i_value < 0){ c[0] = '-'; } f_value = (double)i_value; count = 0; while(f_value >= 1){ f_value = f_value / 10.0; count++; } if(count == 0){ c[2] = '0'; }else{ for(i = 2; count > 0 && i < 9; count--, i++){ f_value = f_value * 10.0; i_value = f_value; c[i] = NUMtoCHAR(i_value); f_value = f_value - i_value; } } printf("10進文字 = "); for(i = 0; i < 9; i++) printf("%c", c[i]); printf("\n"); } 上記プログラムを実行して、入力データとして[32767]を入力すると、結果が[32766]となってしまいます。同じように[34]を入力すると[33]という結果になります。 elseの中に入れ子になっているfor文が怪しいということまでは判るのですが、どのように修正してよいか判りません。 大変長い質問で恐縮ですが、よろしくお願いいたします。 ■環境 OS:WindowsXP Compiler:Borland C++ 5.5.1 fowWin32

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

  • ベストアンサー
  • takebou
  • ベストアンサー率43% (27/62)
回答No.1

入力した数字の桁数を数えた後、f_valueはどうなっていますか? 整数と浮動小数の共存では丸め込みなど行われますので 正確な計算ができくなることは多々あります。 せっかくですから、デバッガの使い方を覚えてf_valueをモニタしながらステップ実行してみましょう。 簡単に整数をcharに変換するには、sprintf関数を使うことです。

hide1978
質問者

お礼

早速の回答ありがとうございます。 なるほど・・・丸め誤差が原因だったんですね。知識としては理解していたつもりなんですが、気がつきませんでした。 実際に、for文内にある i_value = f_value; の下に printf("%d\n", i_value); を挿入し、入力として[32767]を与えて実行してみたところ、[7]と表示されるべき最後の桁が[6]と表示されていました。 あと、教えていただいたsprintf関数を使って見たいのですが、私が持っている書籍にはsprintf関数に関する記述が無く、どのように使用してよいのかわかりません。ネットでも検索してみたのですが、どのサイトも中級者以上を対象に書かれていて、初心者の私には理解できませんでした。 今回のプログラムで以下のような実行結果を得たい場合には、sprintf関数をどのように使えばよいのでしょうか。 ■入力として[-32768]を与えた場合の実行結果 入力データ:-32768 10進文字列 = - 32768 追加質問で申し訳ありませんが、暇なときにでも簡単なサンプルを添えて教えていただけると大変あり難いです。よろしくお願いいたします。m(__)m

その他の回答 (2)

  • takebou
  • ベストアンサー率43% (27/62)
回答No.3

sprintfは、printfの拡張の関数です。 hide1978さんのプログラムにあてはめると、 sprintf( c, "%+d", i_value ); と書けばOKです。 printfの書式の第一引数に文字列を格納するための char型配列を配置すれば良いだけです。

hide1978
質問者

お礼

お返事が遅れて申し訳ありません。 教えていただいた書式を参考に新しくプログラムを組みなおし、何とか目的にかなうプログラムを組むことが出来ました。 今回の質問で新しい発見がいくつもありました。ご回答いただいたtakebouさんとuyama33さんには大変感謝しています。本当にありがとうございました。m(__)m

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.2

sprintf については、 ボーランドの統合環境のヘルプで キーワード検索 として キーワードのタグ を選んで sprintf として 検索すれば 書式、などがでてきます。  または、別売りの マニュアル(高価です) もあるのではないでしょうか? もし、ヘルプがインストールしてなかったら 追加でインストールしてください。

hide1978
質問者

お礼

回答ありがとうございます。お礼が遅くなって申し訳ありません。 ヘルプの件ですが、残念ながら私が使っているのはフリーの[Borand C++ 5.51 for win32]ですからヘルプは付属していません。sprintf関数に関しては、もう少し自分で調べてみようと思います。ありがとうございました。m(__)m