printf 是 C 标准库 <stdio.h> 中的一个函数,用于将格式化后的输出到标准输出(通常是屏幕),它的核心功能就是通过格式符号将变量或常量的值转换成字符串并显示出来。

printf 的基本语法
printf("格式控制字符串", 参数1, 参数2, ...);
- 格式控制字符串:这是一个普通的字符串,可以包含两种内容:
- 普通字符:会原样输出。
- 格式符号:以百分号 开头,后面跟一个或多个字符,用于指定对应参数的输出格式。
- 参数列表:与格式控制字符串中的格式符号一一对应,是需要被格式化输出的变量或常量。
常用格式符号
以下是最常用的一些格式符号,涵盖了基本的数据类型。
整数类型
| 格式符号 | 类型说明 | 示例代码 | 输出结果 |
|---|---|---|---|
%d 或 %i |
有符号十进制整数 | printf("%d", 123); |
123 |
%u |
无符号十进制整数 | printf("%u", 123); |
123 |
%o |
无符号八进制整数 | printf("%o", 10); |
12 |
%x 或 %X |
无符号十六进制整数 ( x用小写字母, X用大写字母) |
printf("%x", 255);printf("%X", 255); |
ffFF |
%c |
单个字符 | printf("%c", 'A'); |
A |
浮点类型
| 格式符号 | 类型说明 | 示例代码 | 输出结果 |
|---|---|---|---|
%f |
单精度/双精度浮点数(默认6位小数) | printf("%f", 3.1415926); |
141593 |
%lf |
用于 scanf:读取 double 类型。在 printf 中,%f 和 %lf 效果完全相同,都可以输出 double 类型。 |
double pi = 3.1415926;printf("%f", pi);printf("%lf", pi); |
141593141593 |
%e 或 %E |
科学计数法(e/E 表示指数) | printf("%e", 123456.0);printf("%E", 123456.0); |
234560e+05234560E+05 |
%g 或 %G |
自动选择 %f 或 %e 中更紧凑的一种格式,去除不必要的零 |
printf("%g", 123456.0);printf("%g", 0.0000123456); |
12345623456e-05 |
其他类型
| 格式符号 | 类型说明 | 示例代码 | 输出结果 |
|---|---|---|---|
%s |
字符串(以 \0 结尾的字符数组) |
printf("%s", "Hello"); |
Hello |
%p |
指针地址 | int a = 10;printf("%p", &a); |
0x7ffc... (一个内存地址) |
| 输出一个百分号 本身 | printf("100%%"); |
100% |
修饰符
在 和格式符号之间,可以插入修饰符来更精确地控制输出格式。
字段宽度修饰符
-
%Nd:N是一个整数,表示输出的最小总宽度,如果实际内容宽度小于N,则默认在左侧填充空格;如果大于N,则按实际宽度输出。printf("%5d\n", 99); // 输出 " 99" (前面有3个空格) printf("%5d\n", 1000); // 输出 "1000" (宽度足够,无需填充) -
%0Nd:与Nd类似,但用数字0填充,常用于对齐数字。
(图片来源网络,侵删)printf("%05d\n", 99); // 输出 "00099" (前面有3个0) -
%-Nd:负号 表示左对齐,即在右侧填充空格。printf("%-5d\n", 99); // 输出 "99 " (后面有3个空格)
精度修饰符
-
对于浮点数
%.Nf:.N表示小数点后保留N位,并进行四舍五入。printf("%.2f\n", 3.14159); // 输出 "3.14" printf("%.4f\n", 3.14159); // 输出 "3.1416" -
对于字符串
%.Ns:.N表示只输出字符串的前N个字符。printf("%.3s\n", "HelloWorld"); // 输出 "Hel" -
对于整数
%Nd:.N表示输出的最小数字位数,不足时在左侧用0填补(效果同%0Nd)。printf("%.5d\n", 99); // 输出 "00099"
长度修饰符
-
h:用于短整型 (short)。short s = 100; printf("%hd\n", s); // 正确输出 short 类型 -
l(小写L):用于长整型 (long) 或双精度浮点数 (double)。long l = 123456789L; double d = 3.1415926535; printf("%ld\n", l); // 输出 long 类型 printf("%lf\n", d); // 输出 double 类型 -
ll(两个小写L):用于长长整型 (long long)。long long ll = 123456789012345LL; printf("%lld\n", ll); // 输出 long long 类型
综合示例
下面是一个综合运用各种符号和修饰符的例子:
#include <stdio.h>
int main() {
int a = 123;
unsigned int b = 255;
float c = 3.14159f;
double d = 123456789.123456789;
char e = 'Z';
char f[] = "This is a test string.";
// 基本整数输出
printf("1. 基本整数: %d, %u, %o, %x\n", a, b, b, b);
// 浮点数输出
printf("2. 浮点数: %f, %.2f, %e, %g\n", c, c, c, c);
// 字符和字符串
printf("3. 字符和字符串: %c, %s\n", e, f);
// 带宽度和精度的输出
printf("4. 格式化对齐:\n");
printf(" 左对齐: |%-10d|\n", a); // 左对齐,宽度为10
printf(" 右对齐: |%10d|\n", a); // 右对齐,宽度为10
printf(" 补零: |%010d|\n", a); // 右对齐,宽度为10,用0填充
printf(" 保留2位小数: |%15.2f|\n", d); // 宽度15,保留2位小数
// 输出百分号
printf("5. 百分号: 100%%\n");
// 指针地址
int var = 10;
printf("6. 指针地址: %p\n", (void*)&var); // 强制转换以避免警告
return 0;
}
可能的输出结果:
基本整数: 123, 255, 377, ff
2. 浮点数: 3.141590, 3.14, 3.141590e+00, 3.14159
3. 字符和字符串: Z, This is a test string.
4. 格式化对齐:
左对齐: |123 |
右对齐: | 123|
补零: |0000000123|
保留2位小数: | 123456789.12|
5. 百分号: 100%
6. 指针地址: 0x7ffc5a1b2a7c
重要提示
-
类型匹配:
printf的格式符号必须与对应的参数类型匹配,不匹配会导致未定义行为,可能会输出乱码、程序崩溃或产生其他意想不到的错误。// 错误示例 int num = 10; printf("%f", num); // 错误:用 %f 输出整数,结果不可预测 -
参数数量:格式控制字符串中的格式符号数量必须与
printf后面提供的参数数量完全一致。// 错误示例 printf("%d %d", 10); // 参数不够,会导致程序崩溃或乱码 -
编译器警告:现代编译器(如 GCC, Clang)在检测到
printf格式不匹配时,通常会给出警告。务必关注并修复这些警告!在 GCC 中使用-Wall选项编译时:gcc -Wall your_program.c -o your_program
如果格式不匹配,你会看到类似
warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat=]的警告。
