【问题标题】:how to use vasprintf() with special characters (%)? [duplicate]如何将 vasprintf() 与特殊字符 (%) 一起使用? [复制]
【发布时间】: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


【解决方案1】:

对于printf() 和家庭功能,

每个转换规范都由字符%介绍。

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

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

%

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    相关资源
    最近更新 更多