• ベストアンサー

sprintf関数の作り方

c言語にsprintf関数っていうのがありますが、 これはどうやって作るのでしょうか? sprintf関数は引数の数が可変であり、引数のデータ型 が様々なので、いったいどうやって作るのか知りたいです。 どこかにソースでもあればいいのですが・・・。

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

  • ベストアンサー
  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.4

#2です。 回答したもののそれほど詳しくはないのですが…。 (1) 引数の個数はどうやって知るのか? 知ることはできません。 従って受け取り側で決め打ちしてやることになりますね。 printfを例に取れば、例えば "%d%d%d" とあれば3つ引数がある“はず”として処理する。 実際にprintfで "%d%d%d" に対して1つしか引数を与えなくてもエラーにはなりません。その代わり無理やり処理して変な値が出ますよね。 (2) 引数の型はどうやって知るのか? これまた知ることはできません。 従ってこれまた受け取り側で決め打ちにすることになります。 ただprintfの場合ですと書式内に型が明示されているので、%dだからint型で受け取ろうとか、%sならchar*型で受け取ろうと処理できます。

ttr133
質問者

お礼

なるほど! 今作ろうとしている関数は自作のsprintf関数 なんです。 sprintf(str, "a = %d, b = %d\n", data1, data2); などとしたいのですね。ご指摘のとおり書式文字列 の中を調べて引数の数を推測することができますね。 なるほど。 すっきりしました。ありがとう。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> どこかにソースでもあればいいのですが・・・。 簡単なので、ここに書きます。 #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)
回答No.2

可変引数のプロトタイプは次のような感じで宣言します。 void func(int num, ...) また可変引数は、va_start(),va_arg(),va_end()という関数で処理できます。 詳しくはこちらのページを参照。 http://www.geocities.jp/ky_webid/c/057.html

ttr133
質問者

補足

すばやいアドバイスありがとう。 少し質問させてください。 (1) 引数の個数はどうやって知るのか? (2) 引数の型はどうやって知るのか? とても気になります。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

関連するQ&A

専門家に質問してみよう