- ベストアンサー
sprintf関数の作り方
c言語にsprintf関数っていうのがありますが、 これはどうやって作るのでしょうか? sprintf関数は引数の数が可変であり、引数のデータ型 が様々なので、いったいどうやって作るのか知りたいです。 どこかにソースでもあればいいのですが・・・。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 回答したもののそれほど詳しくはないのですが…。 (1) 引数の個数はどうやって知るのか? 知ることはできません。 従って受け取り側で決め打ちしてやることになりますね。 printfを例に取れば、例えば "%d%d%d" とあれば3つ引数がある“はず”として処理する。 実際にprintfで "%d%d%d" に対して1つしか引数を与えなくてもエラーにはなりません。その代わり無理やり処理して変な値が出ますよね。 (2) 引数の型はどうやって知るのか? これまた知ることはできません。 従ってこれまた受け取り側で決め打ちにすることになります。 ただprintfの場合ですと書式内に型が明示されているので、%dだからint型で受け取ろうとか、%sならchar*型で受け取ろうと処理できます。
その他の回答 (3)
- jacta
- ベストアンサー率26% (845/3158)
> どこかにソースでもあればいいのですが・・・。 簡単なので、ここに書きます。 #include <stdio.h> #include <stdarg.h> int sprintf(char *s, const char *format, ...) { va_list ap; int result; va_start(ap, format); result = vsprintf(s, format, ap); va_end(ap); return result; }
- ttyp03
- ベストアンサー率28% (277/960)
可変引数のプロトタイプは次のような感じで宣言します。 void func(int num, ...) また可変引数は、va_start(),va_arg(),va_end()という関数で処理できます。 詳しくはこちらのページを参照。 http://www.geocities.jp/ky_webid/c/057.html
補足
すばやいアドバイスありがとう。 少し質問させてください。 (1) 引数の個数はどうやって知るのか? (2) 引数の型はどうやって知るのか? とても気になります。
- chie65536
- ベストアンサー率41% (2512/6032)
お礼
なるほど! 今作ろうとしている関数は自作のsprintf関数 なんです。 sprintf(str, "a = %d, b = %d\n", data1, data2); などとしたいのですね。ご指摘のとおり書式文字列 の中を調べて引数の数を推測することができますね。 なるほど。 すっきりしました。ありがとう。