printf格式符%*.*f的参数消费规则及输出差异技术咨询
关于printf格式说明符
%*.*f的解析与参数消费问题 示例程序与输出
测试代码
#include <stdio.h> int main(void) { int val = 10; float val1 = 56.40f; printf("%d%*.*f\n", val, val, val - 8, val1); printf("%d%f\n", val, val1); return 0; }
运行输出
1056.40
1056.400002
疑问解答
1. %*.*f如何从参数列表中消费参数?
%*.*f会按顺序消费3个参数:
- 第一个整数参数:填充字段宽度的
*占位 - 第二个整数参数:填充精度的
*占位 - 第三个浮点参数:作为要打印的数值
对应示例代码的调用逻辑:
%d消费第一个参数val(值为10)%*.*f依次消费第二个参数val(10,字段宽度)、第三个参数val-8(2,精度)、第四个参数val1(56.40f,待打印浮点数)
2. 两个*分别代表什么,应用顺序是怎样的?
- 第一个
*:字段宽度的动态占位符,替代固定数字,从参数列表取一个整数作为输出的最小字符宽度(实际输出长度大于该值时,按实际长度输出;小于则补空格,示例中数值长度刚好匹配,无空格) - 第二个
*:精度的动态占位符,替代.后的固定数字,从参数列表取一个整数作为浮点数小数部分的显示位数
应用顺序严格遵循格式说明符结构:先处理字段宽度的*,再处理精度的*,最后处理f对应的浮点值。
3. 为何将%*.*f替换为%f后需要的参数数量不同?
%f是基础浮点数格式说明符,仅需要1个浮点参数;而%*.*f包含两个动态占位符*,每个*都要额外消费1个整数参数,再加上f对应的浮点参数,总共需要3个参数。
对应示例:
- 第一个
printf用%*.*f,加上前面的%d,总共需要4个参数 - 第二个
printf用%f,加上前面的%d,总共需要2个参数
4. printf在匹配格式说明符与参数时遵循哪些规则?
- 顺序匹配:格式说明符从左到右逐个解析,参数列表按顺序被消费,两者必须严格对应
- 格式说明符结构:每个格式说明符以
%开头,结构依次为:- 可选标志(如
-左对齐、+强制显示符号) - 可选字段宽度:固定数字或
*(取整数参数) - 可选精度:以
.开头,后跟固定数字或*(取整数参数) - 可选长度修饰符(如
l对应long、ll对应long long) - 转换说明符(如
d整数、f浮点数、s字符串)
- 可选标志(如
- 参数消费规则:每个
*额外消费1个整数参数;转换说明符需匹配对应参数类型(例如float会自动提升为double匹配%f) - 类型匹配要求:参数类型必须与转换说明符要求一致,否则触发未定义行为
- 普通字符直接输出:格式字符串中除
%开头的部分,直接输出到控制台
内容的提问来源于stack exchange,提问作者Destello
相关产品推荐
相关产品推荐

