如何使用特殊字符(%)的vasprintf()?

时间:2015-06-18 13:55:47

标签: c linux string printf format-specifiers

我有以下示例代码。

#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()是否与特殊字符一起使用?或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

对于printf()和家庭功能,

  

每个转换规范都由字符%引入。

因此,与% / printf()系列一起使用时,格式字符串中的scanf()具有特殊含义。您可以使用%% 放弃的特殊含义。

引用这方面的标准,来自fprintf()功能规范

  

%

     

写入%个字符。没有参数被转换。完整的   转换规范应为%%

FWIW,您当前的代码展示undefined behaviour,因为“如果格式的参数不足,则行为未定义。”根据您的代码,没有为%n 格式说明符提供的参数。 功能