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

How to write percent character into a file using variable argument list, va_list, va_start, va_end

我需要在格式字符串中使用 %% 以便像这样编写 % 字符:

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);
}

课程"it doesn't work"。在调用 vsprintf():

之后,您正在调用 printf 并使用其中包含单个 % 的字符串
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); */
}

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

#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%

但是,gcc 理所当然地不喜欢它,并带有关于 printf() 的警告。最好使用 puts() 而不是 printf(),这样您就不必担心 printf 可能会尝试解释的杂散 % 字符。