【发布时间】:2015-06-18 13:55:47
【问题描述】:
我有以下示例代码。
#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() 是否适用于特殊字符?还是我错过了什么?
【问题讨论】:
-
你需要
"%%",因为"%n"本身就是一个转换说明符。 -
你不想使用
vasprintf,或者你没有在vasprintf(3)阅读它的文档 -
我希望我们在 RTFM 和/或常识上有一个密切的理由。说真的,想想就知道了。如果所有转换说明符都以
%开头,那么可怜的printf()如何可能 神奇地读懂你的想法并推断出你没有打算 使用一个特定的@987654330 @ 字符作为格式化命令? -
@TheParamagneticCroissant 另外,如果我没记错的话,由于缺少
%n的参数,当前代码显示为 UB,对吧? -
@SouravGhosh 完全正确。
标签: c linux string printf format-specifiers