- ベストアンサー
ftoa の作り方
atofの逆の変換ftoaの作り方を教えてください。あるいは参考になるページを教えてください。 #include <stdio.h> void ftoa(char *string, double f, int figure) { sprintf(string, "%.*f", figure, f); } main() { char str[10]; ftoa(str, 0.3532, 4); puts(str); } 関数ftoaの部分はネット上で見つけたもので、このように書けば4行ですむらしいのですがどうも実行結果は 0.123400 というふうに4桁に指定しているのに6桁ででてきてしまいます(私の使っているコンピュータでは)。main関数は私が描いたのですが、まずいところがあったら教えてください。ちなみに私はsprintfの使い方がわかっていません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
プログラムを見る限りおかしそうなところは無いので、小数点以下が4桁で出るはずです。どこかにタイプミスか勘違いがあるのでしょう。落ち着いて見直してみてください。 あるいは、本当にここに書いたプログラムのままですか?省略して載せてません? >これはatofの逆の変換ftoaを作れという課題なのですがこれをこのまま出すととまずいでしょうか。 そもそも自分で意味を理解していないものを出してはまずいでしょう。理解したとして、sprintfを使うのが課題の意図に合っているかどうかは、課題の前提となる講義があるはずで、講義の流れに沿ってないとすると駄目でしょうし、合っていればOKでしょう。 >sprintfの引数の"%*f"とはどういう意味なのでしょうか sprintf(s,"%10.5f",v) と sprintf(s,"%*.*f",10,5,v)が同じ結果になるといえば分かりますか?
その他の回答 (2)
- sha-girl
- ベストアンサー率52% (430/816)
sprintfはprintfでモニタに表示されるはずの文字列を そっくりコピーできるものです。 sprintfを使うならftoaの関数を作ることはあまり 意味がありません。(itoa等も同じ) int書き込みバイト数 = sprintf(char *格納先,const char 出力書式文字列,...); d=0.00001; rtn=sprintf(str,"%f",d); これでstrに"0.00001"が格納されていると思います。 4桁にしたいなら d=0.0001; rtn=sprintf(str,"%1.4f",d); としてもいいし strの文字列を探索して "."から数えて+5つめの位置にNULL文字をいれてもいいかと思います。
補足
上記の「私の使っているコンピュータ」は学校のコンピュータなのでそれで動くか今確認することはできませんが、家のコンピュータでは #include <stdio.h> void ftoa(char *string, double f) { sprintf(string, "%1.8f", f); } main() { char str[10]; ftoa(str, 0.3532); puts(str); } としたところ 0.35320000 となりました。自分で書いててわかってないのですがsprintfの引数の"%*f"とはどういう意味なのでしょうか。また、これはatofの逆の変換ftoaを作れという課題なのですがこれをこのまま出すととまずいでしょうか。
- asuca
- ベストアンサー率47% (11786/24626)
ftoaを作られた方がいますので参考にしてみて下さい。
お礼
ご指摘のとおり、学校のほうでは"%.*f"を"%*f"と打ってしまっていました。 >sprintf(s,"%10.5f",v) と sprintf(s,"%*.*f",10,5,v)が同じ結果になるといえば分かりますか? 確かにこう書いていただけるとわかりやすいですね。ありがとうございました。