如何使用可变参数列表 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 可能会尝试解释的杂散 % 字符。
我需要在格式字符串中使用 %%
以便像这样编写 %
字符:
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 可能会尝试解释的杂散 % 字符。