格式化字符串

黎 浩然/ 22 6 月, 2022/ C/C++, 安全/SECURITY, 计算机/COMPUTER/ 0 comments

%[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编码。例如:

Type

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

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

Share this Post

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

*
*