热门问题
时间线
聊天
视角

格式化字符串

来自维基百科,自由的百科全书

Remove ads

格式化字符串(英语:format string)是一些程序设计语言的输入/输出中能将字符串参数转换为另一种形式输出的函数。例如C、C++等程序设计语言的printf类函数,其中的转换说明(conversion specification)用于把随后对应的0个或多个函数参数转换为相应的格式输出;格式化字符串中转换说明以外的其它字符原样输出。[1]

Thumb
一个printf函数的例子

C语言printf函数为代表的一类

格式化占位符

格式化字符串中的占位符用于指明输出的参数值如何格式化。

格式化占位符(format placeholder),语法是:

%[parameter][flags][field width][.precision][length]type

Parameter可以忽略或者是:

更多信息 字符, 描述 ...

Flags可为0个或多个:

更多信息 字符, 描述 ...

Field Width给出显示数值的最小宽度,典型用于制表输出时填充固定宽度的表目。实际输出字符的个数不足域宽,则根据左对齐或右对齐进行填充。实际输出字符的个数超过域宽并不引起数值截断,而是显示全部。宽度值的前导0被解释为0填充标志,如上述;前导的负值被解释为其绝对值,负号解释为左对齐标志。如果域宽值为*,则由对应的函数参数的值为当前域宽。

Precision通常指明输出的最大长度,依赖于特定的格式化类型。对于d、i、u、x、o的整型数值,是指最小数字位数,不足的位要在左侧补0,如果超过也不截断,缺省值为1。对于a,A,e,E,f,F的浮点数值,是指小数点右边显示的数字位数,必要时四舍五入或补0;缺省值为6。对于g,G的浮点数值,是指有效数字的最大位数;缺省值为6。对于s的字符串类型,是指输出的字节的上限,超出限制的其它字符将被截断。如果域宽为*,则由对应的函数参数的值为当前域宽。如果仅给出了小数点,则域宽为0。

Length指出浮点型参数或整型参数的长度。此项Microsoft称为“Size”。可以忽略,或者是下述:

更多信息 字符, 描述 ...

此外,在ISO C99广泛接受前,还有几个平台相关的length选项:

更多信息 字符, 描述 ...

ISO C99的头文件inttypes.h包含了许多宏,用于平台独立的printf编码。例如:

更多信息 宏, 定义 ...
Remove ads

类型

Type,也称转换说明(conversion specification/specifier),可以是:

更多信息 字符, 描述 ...

宽度与精度格式化参数可以忽略,或者直接指定,或者用星号"*"表示取对应函数参数的值。例如printf("%*d", 5, 10)输出"   10";printf("%.*s", 3, "abcdef") 输出"abc"。

如果函数参数太少,不能匹配所有的格式参数说明符,或者函数参数的类型不匹配,将导致未定义(undefined)行为。过多的函数参数被忽略。许多时候,未定义的行为将导致格式化字符串攻击英语Format string attack

某些编译器,如GCC,会静态检查printf这一类函数的格式化参数并编译警告存在的问题(当使用编译标志-Wall-Wformat)。GCC也会对用户自定义的printf风格函数做静态检查,如果在函数定义时使用了非标准的 __attribute__((format(...)))

具有printf风格函数的编程语言

此外,Windows API的FormatMessage函数也使用格式化字符串说明。

Remove ads

参考文献

Loading content...

外部链接

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads