我有以下示例代码。
#include <stdio.h>
#include <unistd.h>
#include <stdarg.h>
int test(const char *fmt,...)
{
va_list args;
char *vacmd=NULL;
va_start(args,fmt);
vasprintf(&vacmd, fmt, args);
printf("vacmd is %s\n", vacmd);
return 0;
}
int main(void)
{
int ret = 0;
char *cmd="@wilso%nqw";
ret = test(cmd);
}
输出是:
vacmd是@wilsoqw
它从字符串中删除了%n
。
所以我的问题是vasprintf()
是否与特殊字符一起使用?或者我错过了什么?
答案 0 :(得分:2)
对于printf()
和家庭功能,
每个转换规范都由字符
%
引入。
因此,与%
/ printf()
系列一起使用时,格式字符串中的scanf()
具有特殊含义。您可以使用%%
放弃的特殊含义。
引用这方面的标准,来自fprintf()
功能规范
%
写入
%
个字符。没有参数被转换。完整的 转换规范应为%%
。
FWIW,您当前的代码展示undefined behaviour,因为“如果格式的参数不足,则行为未定义。”根据您的代码,没有为%n
格式说明符提供的参数。
功能