printf 是 C 标准库 <stdio.h> 中的一个函数,它的全称是 print formatted(格式化打印),用于将格式化后的文本输出到标准输出设备(通常是你的终端/命令行窗口)。

(图片来源网络,侵删)
基本语法
#include <stdio.h> int printf(const char *format, ...);
#include <stdio.h>:在使用printf之前,必须包含这个头文件,因为它包含了printf函数的声明。const char *format:这是一个格式化字符串,它包含了两种内容:- 普通字符:这些字符会原样输出。
- 格式说明符:由一个百分号 开头,后面跟着一个或多个字符,用于指定后面要输出的变量的类型和格式。
- (省略号):这表示
printf是一个可变参数函数,可以接受任意数量的参数,这些参数的类型和数量必须与格式化字符串中的格式说明符一一对应。
核心:格式说明符
格式说明符是 printf 的精髓,它告诉 printf 如何解释和显示后面的变量。
常用格式说明符
| 格式说明符 | 类型 | 示例 | 输出 |
|---|---|---|---|
%d 或 %i |
十进制有符号整数 | int a = 10; printf("%d", a); |
10 |
%c |
单个字符 | char ch = 'A'; printf("%c", ch); |
A |
%s |
字符串(以 \0 结尾的字符数组) |
char str[] = "Hello"; printf("%s", str); |
Hello |
%f |
单精度浮点数(小数) | float f = 3.14f; printf("%f", f); |
140000 |
%lf |
双精度浮点数(小数) | double d = 3.14159; printf("%lf", d); |
141590 |
%e 或 %E |
科学计数法表示的浮点数 | printf("%e", 123456.0); |
234560e+05 |
%p |
指针的地址 | int num = 10; printf("%p", &num); |
0x7ffd12345678 (类似这样) |
%x 或 %X |
十六进制整数(小写/大写) | printf("%x", 255); |
ff |
%o |
八进制整数 | printf("%o", 255); |
377 |
%u |
无符号十进制整数 | unsigned int u = 100; printf("%u", u); |
100 |
| 输出一个百分号字符 | printf("%%"); |
代码示例
示例 1:基本用法
#include <stdio.h>
int main() {
// 普通字符和格式说明符混合
int age = 25;
char name[] = "Alice";
float height = 1.68f;
printf("Hello, my name is %s.\n", name);
printf("I am %d years old.\n", age);
printf("My height is %.2f meters.\n", height); // .2f 表示保留两位小数
return 0;
}
输出:
Hello, my name is Alice.
I am 25 years old.
My height is 1.68 meters.
\n是一个转义字符,表示换行。
示例 2:printf 的返回值
printf 函数会返回它成功打印的字符总数(包括空格、换行符 \n 和所有普通字符),如果发生错误,则返回一个负数。
#include <stdio.h>
int main() {
int count = printf("This is a test.\n");
printf("The printf function printed %d characters.\n", count);
return 0;
}
输出:

(图片来源网络,侵删)
This is a test.
The printf function printed 15 characters.
"This is a test.\n"这个字符串包含了 14 个字母、空格和 1 个换行符\n,总共 15 个字符。
格式说明符的修饰符
你可以在 和字母之间添加修饰符来更精确地控制输出格式。
常用修饰符
-
宽度
%Nd:N是一个整数,表示输出至少占N个字符的位置,如果内容不足N个,默认在左侧补空格。%0Nd:在左侧补零,而不是空格。
printf("%5d\n", 42); // 输出 " 42" (前面有3个空格) printf("%05d\n", 42); // 输出 "00042" (前面有3个零) printf("%5d\n", 1234); // 输出 " 1234" (前面有1个空格) -
对齐方式
%Nd:右对齐(默认)。%-Nd:左对齐。
printf("%5d\n", 42); // 右对齐 " 42" printf("%-5d\n", 42); // 左对齐 "42 " -
精度
(图片来源网络,侵删)- 对于浮点数
%.Nf:表示小数点后保留N位。 - 对于字符串
%.Ns:表示只输出字符串的前N个字符。
double pi = 3.1415926535; printf("Pi with 2 decimal places: %.2f\n", pi); // 输出 "Pi with 2 decimal places: 3.14" printf("Pi with 4 decimal places: %.4f\n", pi); // 输出 "Pi with 4 decimal places: 3.1416" char str[] = "Programming"; printf("First 5 characters: %.5s\n", str); // 输出 "First 5 characters: Progr" - 对于浮点数
-
长度修饰符
h:用于d,i,o,u,x,X,表示short类型。l(小写L):用于d,i,o,u,x,X,表示long类型;用于f,e,g,表示double类型。ll(两个小写L):用于d,i,o,u,x,X,表示long long类型。L:用于f,e,g,表示long double类型。
long long big_number = 123456789012345LL; printf("A very big number: %lld\n", big_number);
安全性问题:printf vs. scanf
printf 虽然强大,但如果格式说明符和实际传入的参数类型不匹配,可能会导致未定义行为,比如程序崩溃或输出乱码。
// 错误示例!
int a = 10;
printf("This is wrong: %f\n", a); // 应该用 %d,却用了 %f
为了解决这个问题,C11 标准引入了更安全的格式化函数族,
int fprintf(FILE *stream, const char *format, ...);(向指定文件流输出)int sprintf(char *str, const char *format, ...);(向字符串缓冲区输出)int snprintf(char *str, size_t size, const char *format, ...);(更安全的 sprintf,限制缓冲区大小)
printf 是 C 语言中最基本、最重要的输出函数,掌握格式说明符及其修饰符是进行格式化输出的关键,请务必确保格式说明符与变量类型匹配,以保证程序的健壮性。
