我需要在格式字符串中使用%%
才能编写%
字符,如下所示:
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);
}
答案 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可能试图解释的杂散%字符。