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 回答