C语言 printf 格式化字符串完整说明文档
1. 基本语法结构
%[标志][宽度][.精度][长度修饰符]类型
| 部分 | 说明 | 示例 |
|---|---|---|
% |
格式说明符开始 | 必需 |
[标志] |
控制输出格式 | -, +, 0, #, |
[宽度] |
最小字段宽度 | 20, * |
[.精度] |
精度控制 | .3, .* |
[长度修饰符] |
数据类型长度 | h, l, ll |
类型 |
数据类型 | s, d, f, c |
2. 标志字符详解
2.1 对齐标志
// 左对齐(默认右对齐)
printf("|%-10s|\n", "ABC"); // |ABC |
printf("|%10s|\n", "ABC"); // | ABC|
// 数字示例
printf("|%-10d|\n", 123); // |123 |
printf("|%10d|\n", 123); // | 123|
2.2 填充标志
// 零填充(仅对数字有效)
printf("|%010d|\n", 123); // |0000000123|
printf("|%-010d|\n", 123); // |123 | (零填充被忽略)
// 空格填充
printf("|% 10d|\n", 123); // | 123|
printf("|% 10d|\n", -123); // | -123|
2.3 符号标志
// 强制显示正负号
printf("|%+10d|\n", 123); // | +123|
printf("|%+10d|\n", -123); // | -123|
// 正数前加空格,负数前加负号
printf("|% 10d|\n", 123); // | 123|
printf("|% 10d|\n", -123); // | -123|
2.4 进制标志
// 八进制前加0
printf("|%#o|\n", 8); // |010|
// 十六进制前加0x
printf("|%#x|\n", 16); // |0x10|
printf("|%#X|\n", 16); // |0X10|
3. 宽度控制
3.1 固定宽度
char str[] = "Hello";
printf("|%10s|\n", str); // | Hello|
printf("|%-10s|\n", str); // |Hello |
printf("|%2s|\n", str); // |Hello| (宽度不足,不截断)
3.2 动态宽度(使用)*
int width = 15;
printf("|%*s|\n", width, "ABC"); // | ABC|
// 宽度和精度都动态
int precision = 3;
printf("|%*.*s|\n", width, precision, "Hello World");
// 输出: | Hel|
4. 精度控制
4.1 字符串精度
char str[] = "Hello World";
printf("|%.5s|\n", str); // |Hello|
printf("|%10.5s|\n", str); // | Hello|
printf("|%-10.5s|\n", str); // |Hello |
4.2 浮点数精度
double num = 3.14159265;
printf("|%.2f|\n", num); // |3.14|
printf("|%10.2f|\n", num); // | 3.14|
printf("|%-10.2f|\n", num); // |3.14 |
4.3 整数精度(零填充)
int num = 123;
printf("|%.5d|\n", num); // |00123|
printf("|%10.5d|\n", num); // | 00123|
printf("|%-10.5d|\n", num); // |00123 |
5. 长度修饰符
5.1 整数长度修饰符
short s = 123;
long l = 123456789L;
long long ll = 123456789012345LL;
printf("|%hd|\n", s); // |123|
printf("|%ld|\n", l); // |123456789|
printf("|%lld|\n", ll); // |123456789012345|
5.2 浮点数长度修饰符
float f = 3.14f;
double d = 3.14159265;
long double ld = 3.141592653589793L;
printf("|%f|\n", f); // |3.140000|
printf("|%lf|\n", d); // |3.141593|
printf("|%Lf|\n", ld); // |3.141593|
6. 类型字符详解
6.1 字符串类型
char str[] = "Hello";
printf("|%s|\n", str); // |Hello|
printf("|%10s|\n", str); // | Hello|
printf("|%-10s|\n", str); // |Hello |
printf("|%.3s|\n", str); // |Hel|
6.2 整数类型
int num = 123;
printf("|%d|\n", num); // |123|
printf("|%o|\n", num); // |173| (八进制)
printf("|%x|\n", num); // |7b| (十六进制小写)
printf("|%X|\n", num); // |7B| (十六进制大写)
printf("|%u|\n", num); // |123| (无符号)
6.3 浮点数类型
double num = 3.14159;
printf("|%f|\n", num); // |3.141590|
printf("|%e|\n", num); // |3.141590e+00| (科学计数法)
printf("|%E|\n", num); // |3.141590E+00|
printf("|%g|\n", num); // |3.14159| (自动选择格式)
printf("|%G|\n", num); // |3.14159|
6.4 字符类型
char ch = 'A';
printf("|%c|\n", ch); // |A|
printf("|%10c|\n", ch); // | A|
printf("|%-10c|\n", ch); // |A |
7. 实际应用示例
7.1 表格对齐
// 创建对齐的表格
printf("| %-15s | %-10s | %-8s |\n", "姓名", "年龄", "分数");
printf("| %-15s | %-10s | %-8s |\n", "张三", "25", "85.5");
printf("| %-15s | %-10s | %-8s |\n", "李四", "30", "92.0");
// 输出:
// | 姓名 | 年龄 | 分数 |
// | 张三 | 25 | 85.5 |
// | 李四 | 30 | 92.0 |
7.2 数字格式化
int num = 12345;
printf("|%10d|\n", num); // | 12345|
printf("|%-10d|\n", num); // |12345 |
printf("|%010d|\n", num); // |0000012345|
printf("|%+10d|\n", num); // | +12345|
printf("|% 10d|\n", num); // | 12345|
7.3 浮点数格式化
double num = 3.14159265;
printf("|%.2f|\n", num); // |3.14|
printf("|%10.2f|\n", num); // | 3.14|
printf("|%-10.2f|\n", num); // |3.14 |
printf("|%010.2f|\n", num); // |0000003.14|
8. 常见错误和注意事项
8.1 宽度不足
char str[] = "Hello World";
printf("|%5s|\n", str); // |Hello World| (不截断)
printf("|%.5s|\n", str); // |Hello| (精度截断)
8.2 精度对整数的影响
int num = 123;
printf("|%.5d|\n", num); // |00123| (零填充)
printf("|%.1d|\n", num); // |123| (精度不足,显示原值)
8.3 标志组合
int num = 123;
printf("|%+-10d|\n", num); // |+123 | (左对齐+符号)
printf("|%0-10d|\n", num); // |123 | (左对齐时零填充无效)
9. 性能优化建议
9.1 避免不必要的精度
// 不推荐:不必要的精度
printf("|%.10s|\n", "Hello"); // |Hello|
// 推荐:合适的精度
printf("|%.5s|\n", "Hello"); // |Hello|
9.2 合理使用宽度
// 不推荐:过大的宽度
printf("|%100s|\n", "Hello"); // 浪费空间
// 推荐:合适的宽度
printf("|%10s|\n", "Hello"); // | Hello|
10. 总结
%-20s= 左对齐,20字符宽度,字符串类型- 宽度控制:确保输出格式整齐
- 精度控制:控制输出精度和截断
- 标志组合:灵活控制输出格式
- 性能考虑:合理使用,避免浪费
这个格式化系统是C语言输出控制的核心,掌握好这些知识可以让你创建出专业、美观的输出格式!