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

解決済みの質問

■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

投稿日時 - 2002-05-24 02:51:53

QNo.277313

困ってます

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

入力した数字の桁数を数えた後、f_valueはどうなっていますか?
整数と浮動小数の共存では丸め込みなど行われますので
正確な計算ができくなることは多々あります。

せっかくですから、デバッガの使い方を覚えてf_valueをモニタしながらステップ実行してみましょう。

簡単に整数をcharに変換するには、sprintf関数を使うことです。

投稿日時 - 2002-05-24 03:13:50

お礼

早速の回答ありがとうございます。

なるほど・・・丸め誤差が原因だったんですね。知識としては理解していたつもりなんですが、気がつきませんでした。

実際に、for文内にある
i_value = f_value;
の下に
printf("%d\n", i_value);
を挿入し、入力として[32767]を与えて実行してみたところ、[7]と表示されるべき最後の桁が[6]と表示されていました。

あと、教えていただいたsprintf関数を使って見たいのですが、私が持っている書籍にはsprintf関数に関する記述が無く、どのように使用してよいのかわかりません。ネットでも検索してみたのですが、どのサイトも中級者以上を対象に書かれていて、初心者の私には理解できませんでした。

今回のプログラムで以下のような実行結果を得たい場合には、sprintf関数をどのように使えばよいのでしょうか。

■入力として[-32768]を与えた場合の実行結果
入力データ:-32768
10進文字列 = - 32768

追加質問で申し訳ありませんが、暇なときにでも簡単なサンプルを添えて教えていただけると大変あり難いです。よろしくお願いいたします。m(__)m

投稿日時 - 2002-05-24 04:30:12

ANo.1

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

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

回答(3)

ANo.3

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

投稿日時 - 2002-05-25 02:17:28

お礼

お返事が遅れて申し訳ありません。

教えていただいた書式を参考に新しくプログラムを組みなおし、何とか目的にかなうプログラムを組むことが出来ました。

今回の質問で新しい発見がいくつもありました。ご回答いただいたtakebouさんとuyama33さんには大変感謝しています。本当にありがとうございました。m(__)m

投稿日時 - 2002-05-25 15:14:49

ANo.2

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

投稿日時 - 2002-05-24 08:20:00

お礼

回答ありがとうございます。お礼が遅くなって申し訳ありません。

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

投稿日時 - 2002-05-24 20:24:07

あなたにオススメの質問