蒙蒙plus
蒙蒙plus
Published on 2025-09-19 / 18 Visits
0
0

C语言 printf 格式化字符串完整说明文档

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语言输出控制的核心,掌握好这些知识可以让你创建出专业、美观的输出格式!


Comment