Myprintf()
のような引数を取る関数を実装したいprintf()
。今私はこれをやっています:
sprintf(demoString, "Num=%d String=%s", num, str);
Myprintf(demoString);
この関数呼び出しを次のように置き換えたい:
Myprintf("Num=%d String=%s", num, str);
これはどのように可能ですか?
#include <stdio.h>
#include <stdarg.h>
extern int Myprintf(const char *fmt, ...);
int Myprintf(const char *fmt, ...)
{
char buffer[4096];
va_list args;
va_start(args, fmt);
int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
va_end(args);
...print the formatted buffer...
return rc;
}
出力がどのように行われるかは、あなたの質問からは明確ではありません。あなたの既存のMyprintf()
ものはおそらくそれをどこかに出力しfprintf()
ます。その場合は、代わりに次のように書くことができます。
int Myprintf(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
int rc = vfprintf(debug_fp, fmt, args);
va_end(args);
return rc;
}
戻り値を使用したくない場合は、関数を として宣言void
し、変数を気にしないでくださいrc
。
printf()
これは、「カバー関数」のかなり一般的なパターンです。
およびそのprintf
親戚は、可変個引数リストを操作する C 標準ライブラリのヘッダーにマクロ/関数があります。<stddef.h>
例については、GNU ドキュメントを参照してください: How Variadic Functions are defined and Used。