人们说用vprintf代替printf。但我不能,因为我需要使用自己的函数。
我有两个自定义函数
两者都使用虚拟列表
一个函数使用另一个函数
所以有没有可能把va_list呼叫连起来而不需要那些v。。。功能?怎么做?
代码:

char* createString(const char* line, ...)
{
    char* result = (char*)malloc(100);
    va_list args;
    va_start(args, line);
    vsprintf(result, line, args);
    va_end(args);
    return result;
}

void show(const char* line, ...)
{
    va_list args;
    va_start(args, line);
    char* a = createString(line, args);
    va_end(args);

    AfxMessageBox(a);
    free(a);
}

// usage:
show("test %i, %i", 12, 123);

当我尝试这个时,我得到了错误的字符串显示。而不是12和123我得到一些指针或东西。
可悲的解决方案:
char* vCreateString(const char* line, va_list args)
{
    char* result = (char*)malloc(100);
    vsprintf(result, line, args);
    return result;
}

最佳答案

不,不可能。这就是为什么v版本首先存在,以支持在va_list上传递的原因。
您需要使createString()接受va_list参数。
另外,please don't cast the return value of malloc() in C,并考虑使用vsnprintf()来防止缓冲区溢出。

关于c - 如何将变量参数列表传递给另一个类似于printf的函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23754556/

10-12 01:32
查看更多