【问题标题】:What is the meaning of a quote in the conversion specification of a format string?格式字符串的转换规范中的引号是什么意思?
【发布时间】:2020-11-02 17:03:20
【问题描述】:

我发现我们可以在格式字符串的转换规范中使用一个(或多个)引号。例如:

void f(int i)
{
    printf("%'d\n", i);
}

这段代码编译得很好,并且在没有引号的情况下表现得完全一样。

我想知道这句话是什么意思。它会对printf 函数的行为产生影响吗?如果不是,为什么允许这样做?

我在cppreference 中没有找到有关它的信息。

【问题讨论】:

    标签: c format-specifiers


    【解决方案1】:

    Cppreference 记录了 C 标准。撇号是对 POSIX 记录的 C 标准的扩展。来自POSIX fprintf

    标志字符及其含义是:

    '
    (。)十进制转换结果的整数部分(%i、%d、%u、%f、%F、%g 或 %G)应使用千位分组字符进行格式化。对于其他转换,行为未定义。使用了非货币分组字符。

    【讨论】:

      【解决方案2】:

      这是记录在案的 - 用逗号表示整数

      例如

      1,000
      

      不是

      1000
      

      如果您所在的地区在逗号之间使用 3 位数字

      参考https://en.wikipedia.org/wiki/Printf_format_string

      【讨论】:

      • 那个维基百科页面不是一个好的来源。它没有说明撇号标志是由 POSIX 定义的,而不是由 C 标准定义的。这个答案也是如此。
      • 不太清楚你对@EricPostpischil 有什么问题——我引用的页面包含指向posix 标准的链接。如果可以做得更好,请随时编辑我的答案。
      • 该页面确实有指向 POSIX 标准的链接。但它没有说明撇号标志是由 POSIX 定义的,而不是由 C 标准定义的。这个答案也没有。
      • 它链接到 en.wikipedia.org/wiki/Single_UNIX_Specification 似乎深入讨论了 POSIX
      • 撇号标志的表条目显示“小数的整数或指数应用了千位分组分隔符。”那句话没有说明标志是否由 POSIX 标准定义。那句话没有说明标志是否由 C 标准定义。它缺乏信息。读者不会从该表中知道他们是否可以依赖为 C 实现而不是 POSIX 实现编写的程序是否可以使用撇号标志。信息可能存在于某个巨大的链接资源中这一事实并不能弥补这一缺陷。
      猜你喜欢
      • 2018-08-28
      • 2021-11-25
      • 1970-01-01
      • 2022-04-08
      • 2021-09-11
      • 2011-06-10
      • 1970-01-01
      • 2012-05-25
      • 2010-09-29
      相关资源
      最近更新 更多