文章目录
- [1. 类型符(Type Specifiers)------ 必选](#1. 类型符(Type Specifiers)—— 必选)
- [2. 标志(Flags)------ 可选](#2. 标志(Flags)—— 可选)
- [3. 最小宽度(Width)------ 可选](#3. 最小宽度(Width)—— 可选)
- [4. 精度(.Precision)------ 可选](#4. 精度(.Precision)—— 可选)
- [5. 长度修饰符(Length)------ 可选](#5. 长度修饰符(Length)—— 可选)
- 代码示例
printf 函数的格式控制字符串是 C 语言中最强大也最复杂的工具之一。其完整语法格式为:
%[标志][最小宽度][.精度][长度修饰符]类型符
1. 类型符(Type Specifiers)------ 必选
决定了数据以何种形式呈现。
| 类型符 | 描述 | 示例 |
|---|---|---|
| %d / %i | 有符号十进制整数 | 123 |
| %u | 无符号十进制整数 | 123 |
| %o | 无符号八进制整数 | 173 |
| %x / %X | 无符号十六进制整数(小写/大写) | 7b / 7B |
| %f | 十进制浮点数(默认 6 位小数) | 3.141593 |
| %e / %E | 科学计数法(小写/大写) | 3.14e+00 |
| %g / %G | 自动选择 %f 或 %e 中较短的一种 | - |
| %c | 单个字符 | 'A' |
| %s | 字符串 | "Hello" |
| %p | 指针地址(十六进制) | 0x7ffe... |
| %% | 输出一个百分号 % | % |
2. 标志(Flags)------ 可选
用于微调输出的外观。
| 标志 | 描述 |
|---|---|
| - | 左对齐(默认是右对齐)。 |
| + | 显示正负号。正数前加 +,负数前加 -。 |
| 空格 | 正数前加空格,负数前加 -(与 + 冲突时 + 优先)。 |
| # | 特殊转换:%o 前加 0,%x 前加 0x;对于浮点数,强制显示小数点。 |
| 0 | 零填充:在宽度范围内用 0 代替空格填充(通常用于数字)。 |
3. 最小宽度(Width)------ 可选
指定输出内容占用的最小字符数。
如果实际内容长度小于宽度,则根据对齐方式填充空格或 0。
如果实际内容长度大于宽度,则按实际长度输出(不会截断)。
动态宽度:可以使用 *,由后面的参数指定。例如 printf("%*d", 5, 10); 等同于 %5d。
4. 精度(.Precision)------ 可选
以点号 . 开头,后跟数字。
对于整数:表示输出的最少数字位数。不足则补 0(如 %.3d 输出 001)。
对于浮点数:表示小数点后的位数(四舍五入)。
对于字符串:表示输出的最大字符数(超过则截断)。
动态精度:同样可以使用 *。例如 printf("%.*f", 2, 3.1415);。
5. 长度修饰符(Length)------ 可选
用于指定数据类型的具体长度(如 long 或 short)。
| 修饰符 | 描述 | 示例 |
|---|---|---|
| h | 短整型 (short) | %hd |
| l | 长整型 (long) 或 宽字符 | %ld, %lf |
| ll | 长度更长的整型 (long long) | %lld |
| L | 长双精度浮点型 (long double) | %Lf |
代码示例
bash
#include <stdio.h>
int main() {
int num = 42;
double pi = 3.14159265;
char *str = "Hello World";
// 1. 宽度与对齐
printf("|%10d|\n", num); // 右对齐,宽度10
printf("|%-10d|\n", num); // 左对齐,宽度10
printf("|%010d|\n", num); // 补零,宽度10
// 2. 精度控制
printf("%.2f\n", pi); // 保留2位小数: 3.14
printf("%.5s\n", str); // 只输出前5个字符: Hello
// 3. 进制与符号
printf("%+d\n", num); // 强制显示正号: +42
printf("%#x\n", num); // 显示十六进制前缀: 0x2a
// 4. 动态参数
printf("%*.*f\n", 8, 3, pi); // 宽度8,精度3: " 3.142"
return 0;
}