介绍
printf 是 C 语言中最常用的输出函数,用于向标准输出设备(通常是控制台)打印格式化的字符串和数据。它属于标准库 <stdio.h>,功能强大且灵活,是初学者接触 C 语言输入输出的基础。
一、基本用法
1. 函数原型
#include <stdio.h>
int printf(const char *format, ...);
format:格式控制字符串(包含普通字符和格式说明符)。...:可变参数列表,对应格式说明符的具体数据。- 返回值:成功打印的字符总数(包括空格、换行等),失败时返回负数。
2. 最简单的输出
打印纯字符串(无变量):
#include <stdio.h>
int main() {
printf("Hello, World!\n"); // 输出:Hello, World!(\n 表示换行)
return 0;
}
二、格式说明符(核心)
格式说明符以 % 开头,用于指定输出数据的类型和格式。常用类型如下:
| 格式符 | 对应数据类型 | 说明 |
|---|---|---|
%d |
int(整数) | 十进制有符号整数 |
%u |
unsigned int | 十进制无符号整数 |
%x |
unsigned int | 十六进制小写(如 a-f) |
%X |
unsigned int | 十六进制大写(如 A-F) |
%o |
unsigned int | 八进制整数 |
%f |
float/double | 十进制浮点数(默认保留6位小数) |
%lf |
double | 双精度浮点数(C99标准) |
%c |
char | 单个字符 |
%s |
char*(字符串) | 以 \0 结尾的字符串 |
%p |
void*(指针) | 指针的十六进制地址(带 0x 前缀) |
%% |
无 | 输出百分号 % |
示例:输出不同类型数据
#include <stdio.h>
int main() {
int a = 100;
unsigned int b = 200;
float c = 3.14159;
char d = 'A';
char* str = "Hello";
int* ptr = &a;
printf("整数:%d\n", a); // 整数:100
printf("无符号整数:%u\n", b); // 无符号整数:200
printf("十六进制:%x(小写)%X(大写)\n", a, a); // 十六进制:64(小写)64(大写)
printf("浮点数:%f\n", c); // 浮点数:3.141590(默认6位小数)
printf("字符:%c\n", d); // 字符:A
printf("字符串:%s\n", str); // 字符串:Hello
printf("指针地址:%p\n", ptr); // 指针地址:0x7ffdxxxx(具体地址因系统而异)
printf("百分比:%%\n"); // 百分比:%
return 0;
}
三、格式控制(进阶)
可以在 % 和格式符之间添加修饰符,控制输出的宽度、对齐方式、小数位数等。
1. 控制宽度(数字)
格式:%[宽度]格式符
若输出内容长度小于指定宽度,默认右对齐,空格补位;若超过则按实际长度输出。
#include <stdio.h>
int main() {
int num = 123;
printf("默认宽度:%d\n", num); // 默认宽度:123
printf("宽度为5:%5d\n", num); // 宽度为5: 123(前面补2个空格)
printf("宽度为2:%2d\n", num); // 宽度为2:123(超过宽度,按实际输出)
return 0;
}
2. 左对齐(- 修饰符)
格式:%-[宽度]格式符
使内容在指定宽度内左对齐,空格补在右侧。
printf("右对齐(默认):%5d\n", 123); // 右对齐(默认): 123
printf("左对齐:%-5d|\n", 123); // 左对齐:123 |(后面补2个空格)
3. 控制浮点数小数位数(. 修饰符)
格式:%[宽度].[小数位数]f
精确控制浮点数的小数部分位数。
float pi = 3.1415926;
printf("默认:%f\n", pi); // 默认:3.141593(自动四舍五入)
printf("保留2位小数:%.2f\n", pi); // 保留2位小数:3.14
printf("宽度8,保留2位:%8.2f\n", pi); // 宽度8,保留2位: 3.14(总宽度8,右对齐)
4. 补零(0 修饰符)
格式:%0[宽度]格式符
对整数或浮点数的整数部分补零(而非空格)。
int num = 123;
printf("补零(宽度5):%05d\n", num); // 补零(宽度5):00123
printf("浮点数补零:%08.2f\n", 3.14); // 浮点数补零:0003.14(总宽度8)
四、常见问题与注意事项
1. 格式符与数据类型不匹配
例如:用 %d 输出 float 类型,会导致输出乱码或错误(未定义行为)。
float f = 1.2;
printf("%d", f); // 错误!应使用 %f
2. 字符串必须以 \0 结尾
%s 会一直输出到 \0 为止,若字符串无结束符,会打印垃圾值。
char str[3] = {'H', 'i'}; // 无 \0,输出可能为 "Hi垃圾值"
// 正确写法:char str[] = "Hi"; // 自动添加 \0
3. 指针输出的是地址而非内容
%p 输出指针变量存储的地址,而非指向的数据(需解引用)。
int a = 10;
int* p = &a;
printf("指针地址:%p\n", p); // 地址:0x7ffdxxxx
printf("指针指向的值:%d\n", *p); // 值:10
4. 换行符 \n 的作用
\n 不仅换行,还会刷新输出缓冲区(确保内容立即显示)。若无 \n,内容可能暂存在缓冲区,需手动刷新(fflush(stdout))。
五、与其他输出函数的区别
puts(const char* s):仅输出字符串,自动添加换行(\n),功能简单。puts("Hello"); // 等价于 printf("Hello\n");fprintf(FILE* stream, ...):向指定文件输出(如文件、串口),printf是fprintf(stdout, ...)的特例。
总结
printf 是 C 语言格式化输出的核心工具,通过格式说明符和修饰符可灵活控制输出样式。掌握其用法是编写 C 程序的基础,尤其要注意格式符与数据类型的匹配,避免因未定义行为导致的错误。