6

Myprintf()のような引数を取る関数を実装したいprintf()。今私はこれをやっています:

sprintf(demoString, "Num=%d String=%s", num, str);
Myprintf(demoString);

この関数呼び出しを次のように置き換えたい:

Myprintf("Num=%d String=%s", num, str);

これはどのように可能ですか?

4

3 に答える 3

13
#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()これは、「カバー関数」のかなり一般的なパターンです。

于 2013-02-08T05:17:58.357 に答える
1

可変引数を持つ関数を定義し、vsprintfを使用して文字列を作成する必要があります。

于 2013-02-08T05:09:21.383 に答える
1

およびそのprintf親戚は、可変個引数リストを操作する C 標準ライブラリのヘッダーにマクロ/関数があります。<stddef.h>例については、GNU ドキュメントを参照してください: How Variadic Functions are defined and Used

于 2013-02-08T05:09:40.470 に答える