この人頭いいなと思ったエピソード

c言語にsprintf関数っていうのがありますが、
これはどうやって作るのでしょうか?

sprintf関数は引数の数が可変であり、引数のデータ型
が様々なので、いったいどうやって作るのか知りたいです。

どこかにソースでもあればいいのですが・・・。

A 回答 (4件)

#2です。


回答したもののそれほど詳しくはないのですが…。

(1) 引数の個数はどうやって知るのか?

知ることはできません。
従って受け取り側で決め打ちしてやることになりますね。
printfを例に取れば、例えば "%d%d%d" とあれば3つ引数がある“はず”として処理する。
実際にprintfで "%d%d%d" に対して1つしか引数を与えなくてもエラーにはなりません。その代わり無理やり処理して変な値が出ますよね。

(2) 引数の型はどうやって知るのか?

これまた知ることはできません。
従ってこれまた受け取り側で決め打ちにすることになります。
ただprintfの場合ですと書式内に型が明示されているので、%dだからint型で受け取ろうとか、%sならchar*型で受け取ろうと処理できます。
    • good
    • 1
この回答へのお礼

なるほど!
今作ろうとしている関数は自作のsprintf関数
なんです。

sprintf(str, "a = %d, b = %d\n", data1, data2);

などとしたいのですね。ご指摘のとおり書式文字列
の中を調べて引数の数を推測することができますね。
なるほど。

すっきりしました。ありがとう。

お礼日時:2006/05/08 17:50

> どこかにソースでもあればいいのですが・・・。



簡単なので、ここに書きます。

#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;
}
    • good
    • 2

可変引数のプロトタイプは次のような感じで宣言します。



void func(int num, ...)

また可変引数は、va_start(),va_arg(),va_end()という関数で処理できます。

詳しくはこちらのページを参照。
http://www.geocities.jp/ky_webid/c/057.html

この回答への補足

すばやいアドバイスありがとう。

少し質問させてください。

(1) 引数の個数はどうやって知るのか?
(2) 引数の型はどうやって知るのか?

とても気になります。

補足日時:2006/05/08 16:56
    • good
    • 0
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報