如何使用变量参数列表,va_list,va_start,va_end将百分比字符写入文件

时间:2015-11-09 18:32:08

标签: c++ c printf variadic-functions

我需要在格式字符串中使用%%才能编写%字符,如下所示:

printf("%%");

我试图在我的变量参数列表函数中执行此操作。格式说明符工作正常,例如%d%s等。但是当我尝试使用%编写%%字符时,它不起作用。为什么有解决方案?

void foo(LPCSTR sFrmtStr, ...)   
{   
    char buffer[4096] = { 0 };

    va_list argList;
    va_start(argList, sFrmtStr);
    vsprintf(buffer, sFrmtStr, argList);
    va_end(argList);

    printf(buffer);
}

2 个答案:

答案 0 :(得分:6)

当然"它没有工作"。在调用printf后,您正在使用其中包含%个字符串的字符串调用vsprintf()

void foo(LPCSTR sFrmtStr, ...)   
{   
    char buffer[4096] = { 0 };

    va_list argList;
    va_start(argList, sFrmtStr);
    vsprintf(buffer, sFrmtStr, argList);
    va_end(argList);

    /* Now buffer holds a string with a single '%' in it */
    printf(buffer);
}

修复:

void foo(LPCSTR sFrmtStr, ...)   
{   
    /* doesn't need to be initialized */
    char buffer[4096];

    va_list argList;
    va_start(argList, sFrmtStr);
    /* assume vsnprintf is available */
    vsnprintf(buffer, sizeof( buffer ), sFrmtStr, argList);
    va_end(argList);

    /* puts() is probably better... */
    /* and fputs( buffer, stdout ) is even better... */
    fputs( buffer, stdout );
    /* printf("%s", buffer); */
}

答案 1 :(得分:0)

您的代码适用于以下用途:

#include <stdarg.h>
#include <stdio.h>

void foo(char* sFrmtStr, ...)   
{   
    char buffer[4096] = { 0 };

    va_list argList;
    va_start(argList, sFrmtStr);
    vsprintf(buffer, sFrmtStr, argList);
    va_end(argList);

    printf(buffer);
}

int main()
{
  foo("n=%d pct %%\n", 23);
  return 0;
}

输出:

n = 23 pct%

然而,gcc理所当然地不喜欢它有关于printf()的警告。最好使用puts()而不是printf(),然后你不必担心printf可能试图解释的杂散%字符。