• ベストアンサー

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の使い方がわかっていません。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4852/10266)
回答No.3

プログラムを見る限りおかしそうなところは無いので、小数点以下が4桁で出るはずです。どこかにタイプミスか勘違いがあるのでしょう。落ち着いて見直してみてください。 あるいは、本当にここに書いたプログラムのままですか?省略して載せてません? >これはatofの逆の変換ftoaを作れという課題なのですがこれをこのまま出すととまずいでしょうか。 そもそも自分で意味を理解していないものを出してはまずいでしょう。理解したとして、sprintfを使うのが課題の意図に合っているかどうかは、課題の前提となる講義があるはずで、講義の流れに沿ってないとすると駄目でしょうし、合っていればOKでしょう。 >sprintfの引数の"%*f"とはどういう意味なのでしょうか sprintf(s,"%10.5f",v) と sprintf(s,"%*.*f",10,5,v)が同じ結果になるといえば分かりますか?

takahiroj
質問者

お礼

ご指摘のとおり、学校のほうでは"%.*f"を"%*f"と打ってしまっていました。 >sprintf(s,"%10.5f",v) と sprintf(s,"%*.*f",10,5,v)が同じ結果になるといえば分かりますか? 確かにこう書いていただけるとわかりやすいですね。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

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文字をいれてもいいかと思います。

takahiroj
質問者

補足

上記の「私の使っているコンピュータ」は学校のコンピュータなのでそれで動くか今確認することはできませんが、家のコンピュータでは #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)
回答No.1

ftoaを作られた方がいますので参考にしてみて下さい。

参考URL:
http://www1.linkclub.or.jp/~zhidao/zlab/computing/rtlinux.html,http://f1.aaacafe.ne.jp/~pointc/log184.html
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • sprintfを用いたフォーマット文字列攻撃

    sprintfを用いたフォーマット文字列攻撃に関する質問です。 main文の中で --------------------- int main(void){ char str[50]; sprintf(str,"%s"); puts(str); } --------------------- を実行すると(null)で帰ってきます。 しかし関数呼び出しを行うと結果が変わってきます。 --------------------- void f(){ char str[50]; sprintf(str,"%s"); puts(str); } int main(void){ f(); } --------------------- これを実行すると" ・L "のような文字化けしたものに変わりました。 sprintf(str,"%s%s");と記述することによって" ・L (null) "と、本来呼び出される箇所のものが格納されています。 なぜ関数呼び出しにすると変なところを参照してしまうのか(第3引数があると勘違いしてしまうのか)教えてください。 また、これによりどのような悪影響があるのか教えてください。 自分はプログラマが意図しない箇所を参照するため攻撃者のプログラムアドレスを格納してしまう恐れがあると考えています。

  • C言語のint型の配列が分かりません

    #include<stdio.h> int main(void) { int str[ ]={0,1,2} printf("%s\n", str); return 0; } というプログラムをC言語でつくってみましたが動きません.(012と表示されて欲しかったのですが) int str[ ]={1,2,3}の部分をchar str[ ]={'0','1','2'}とすれば動きます. そこで質問なのですが, printf("~%s~", (配列名));  はchar型の配列にしか適応できないのですか? ※追記 puts関数の定義は int puts (const char *str); であるそうなので char型の仮引数にはchar型のアドレスを渡さなければいけません. ではprintf関数の定義は一体どんなものなのですか?

  • abcdとキーボードで打ったらdcbaと表示されるプログラム

    C言語に関しては初心者です。 メイン関数は変更せずに行います。 /* reverse.c: reverse a given string */ #include <stdio.h> #include <string.h> void reverse(char *); /* プロトタイプ宣言 */ int main(void) { char str[100]; scanf("%s", str); reverse(str); printf("%s\n", str); return (0); } void reverse(char *s) { char n; int i; char str; n = strlen(str) - 1; for(i=0,i++,i<=100) { s[i] = *s[n-i]; printf("%s\"s[i]); } }

  • 文字列をうまく返してくれない

    数値を文字列として呼び出し元に渡し、呼び出し元で文字列を数値に変えようとしたのですがatoi関数(strtolを使うと最初の文字のみ帰ってくるため2桁以上の数値に対応できない)を使うとうまく行きませんでした。 どのように変更したらatoiが使える文字列になりますか? #include <stdio.h> #include <stdlib.h> static struct{   char *name; }kuda[5]={   { "もも" , "りんご" , "みかん" , "バナナ" , "パイナップル" } } char *re_3( void ){   int a = 3;   char str_h[100];   char *str;   sprintf_s( str_h , 100 , "%d" , a );   *str = *str_h; //原因はおそらくここ   return str; } void main( void ){   printf( "%s" , kuda[ atoi( re_3() ) ].name ); }

  • 文字列を関数に渡すぷろぐらむなのですがおかしいです。

    <ソース> #include<stdio.h> #include<stdlib.h> void str(char a[]); int main() { char st[10]="abcde"; str(st); str("ABCabc123"); return 0; } void str(char a[]) { int i; printf("%s\n",a); i=0; while(a[i]){ a[i]=toupper(a[i]); putchar(a[i]); i++; } putchar('\n'); } 分からないところがあるので質問します。 toupperは、大文字にするんですよね。 putcharは、基本的にchar型でしたっけ? putsとgetsは、int型でしたっけ? 後、プログラムが暴走してます。 どこがおかしいんでしょう?

  • 文字列のコピー

    C言語で、文字列をコピーする関数で、処理が止まってしまいます。 以下が実行したプログラムです。 #include<stdio.h> #include<string.h> void copy(char *str2 ,char *str3){ strcpy(str2,str3); } void input(char* str){ scanf("%s",str); } int main (void){ char *a; char *b="TEST"; printf("%s\n",b); input(a); copy(b,a); printf("%s",b); return(0);} copy(b,a);で処理が止まってしまいます。入力した文字列を表示できるように、御指摘お願いします。

  • 文字の並べ替え

    C言語で文字の並べ替えをしたいのですが条件があり ポインタを使って文字を並べ替える別の関数をを渡さなければなりません.(void reverse(char *str)をつくる) そこで作ったのが #include <stdio.h> #include <string.h> void reverse(char *str); int main(void){ char s[80]; gets(s); reverse(s); printf("%s\n",s); return 0; } void reverse(char *str){ char q[80]; int i,n; n=strlen(str)-1; str+=n; for(i=0;i<=n;i++)q[i]=*str--; str++; q[i]='\0'; for(i=0;i<=n;i++)*str++=q[i]; } なのですが ポインタを使っている意味が余りないので ポインタを使うよりよいプログラムを教えてください. (アドバイスでもかまいません.)

  • プログラミング 関数

    逆順する関数reverseを作成したいんです。 以下のは関数reverseを利用したmainのプログラムです。 #include <stdio.h> void reverse(char str1[],char str2[]); int main (void) { char strin[255]="abcdefg"; char strout[255]; reverse(strin, strout); printf(" input=%s\n",strin); printf("output=%s\n",strout); return 0; } 教えてください。

  • プログラミング 関数

    教えてください。 入力された文字列のうち、文字aの数を数える関数count_aを作成する。 以下は関数count_aを利用したmainのプログラムの例です。 #include <stdio.h> int count_a(char str[]); int main ( void ) { char str[255]="abcaeag"; printf("%d\n",count_a(str)); return 0; }

  • プログラムを上手く動かすには…

    与えられた文字列の文字を全て大文字に変換する関数letter2capを作成しなさい。関数letter2capではポインタを使用すること。 #include<stdio.h> #include<ctype.h> #define MAXCHAR 1024 void letter2cap ( char* ); int main( void ) { char str[MAXCHAR]; gets( str ); letter2cap( str ); printf("%sn",str); return 0; } void letter2cap( char* str) { while( *str ){ *str = toupper( *str ); } } 上手く動かすには何が足りないのでしょうか?