C 输出转换语法

来自泡泡学习笔记
BrainBs讨论 | 贡献2024年1月8日 (一) 09:38的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

本节提供了关于printf模板字符串中可能出现的精确转换规范的详细信息。


模板字符串中的非转换规范字符会原样打印到输出流。模板字符串中允许多字节字符序列(参见字符集处理)。


printf模板字符串中的转换规范具有一般形式:

% [ param-no $] flags width [ . precision ] type conversion

% [ param-no $] flags width . * [ param-no $] type conversion

例如,在转换说明符‘%-10.8ld’中,“-”是一个标志,“10”指定了字段宽度,精度是“8”,字母“l”是一个类型修饰符,而“d”指定了转换样式。(这个特定的类型说明符表示以十进制表示法打印一个长整型参数,至少需要8位数字左对齐在一个至少10个字符宽的字段中。)


更详细地说,输出转换规范由以下部分组成:

  • 一个可选的用于此格式的参数规范。通常,printf函数的参数分配给格式字符串中出现的顺序。但在一些情况下(如消息翻译),这不是可取的,并且此扩展允许显式指定参数。

    格式的param-no部分必须是1到传递给函数调用的最大参数数量之间的整数。某些实现将此数字限制为某个上限。可以通过以下常量检索确切的限制。

    宏:NL_ARGMAX

    NL_ARGMAX的值是printf调用中特定位置参数规范允许的最大值。运行时实际有效的值可以通过使用sysconf并使用_SC_NL_ARGMAX参数检索。请参阅sysconf的定义。

    某些系统有非常低的限制。GNU C库没有真正的限制。

    如果格式的任何位置都有参数规范,则格式字符串中的所有位置都必须有一个。否则,行为是未定义的。

  • 零个或多个修改转换规范正常行为的标记字符。

  • 一个可选的十进制整数,指定最小字段宽度。如果正常转换产生的字符数少于此数,则用空格填充字段以达到指定的宽度。这是一个最小值;如果正常转换产生的字符数多于此数,则不截断字段。通常,输出在字段内右对齐。

    您还可以指定字段宽度为“*”。这意味着下一个参数列表(在要打印的实际值之前)将被用作字段宽度。值必须是一个int。如果值为负数,这意味着设置“-”标志(见下文),并使用绝对值作为字段宽度。

  • 一个可选的精度来指定数值转换的位数。如果指定了精度,它由一个句点(“.”)可选地后跟一个十进制整数组成(如果省略,则默认为零)。

    您还可以指定精度为“”。这意味着下一个参数列表(在要打印的实际值之前)将被用作精度。值必须是一个int,如果值为负数,则忽略该值。如果为字段宽度和精度都指定了“”,则字段宽度参数位于精度参数之前。其他C库版本可能无法识别此语法。

  • 一个可选的类型修饰符字符,用于指定与默认类型不同的相应参数的数据类型。(例如,整数转换假设类型为int,但您可以指定“h”、“l”或“L”以表示其他整数类型。)

  • 一个字符,指定要应用的转换。


使用“-Wformat”选项,GNU C编译器检查对printf和相关函数的调用。它检查格式字符串并验证是否正确提供了正确数量和类型的参数。此外,GNU C语法告诉编译器您编写的函数使用printf风格的格式字符串。