C语言:printf()函数 作者:马育民 • 2025-11-12 14:49 • 阅读:10007 # 介绍 `printf` 是 C 语言中最常用的输出函数,用于向标准输出设备(通常是控制台)打印格式化的字符串和数据。它属于标准库 ``,功能强大且灵活,是初学者接触 C 语言输入输出的基础。 # 一、基本用法 ### 1. 函数原型 ```c #include int printf(const char *format, ...); ``` - `format`:格式控制字符串(包含普通字符和格式说明符)。 - `...`:可变参数列表,对应格式说明符的具体数据。 - 返回值:成功打印的字符总数(包括空格、换行等),失败时返回负数。 ### 2. 最简单的输出 打印纯字符串(无变量): ```c #include 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` 前缀) | | `%%` | 无 | 输出百分号 `%` | ### 示例:输出不同类型数据 ```c #include 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. 控制宽度(数字) 格式:`%[宽度]格式符` 若输出内容长度小于指定宽度,默认右对齐,空格补位;若超过则按实际长度输出。 ```c #include 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. 左对齐(`-` 修饰符) 格式:`%-[宽度]格式符` 使内容在指定宽度内左对齐,空格补在右侧。 ```c printf("右对齐(默认):%5d\n", 123); // 右对齐(默认): 123 printf("左对齐:%-5d|\n", 123); // 左对齐:123 |(后面补2个空格) ``` ### 3. 控制浮点数小数位数(`.` 修饰符) 格式:`%[宽度].[小数位数]f` 精确控制浮点数的小数部分位数。 ```c 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[宽度]格式符` 对整数或浮点数的整数部分补零(而非空格)。 ```c int num = 123; printf("补零(宽度5):%05d\n", num); // 补零(宽度5):00123 printf("浮点数补零:%08.2f\n", 3.14); // 浮点数补零:0003.14(总宽度8) ``` # 四、常见问题与注意事项 ### 1. 格式符与数据类型不匹配 例如:用 `%d` 输出 `float` 类型,会导致输出乱码或错误(未定义行为)。 ```c float f = 1.2; printf("%d", f); // 错误!应使用 %f ``` ### 2. 字符串必须以 `\0` 结尾 `%s` 会一直输出到 `\0` 为止,若字符串无结束符,会打印垃圾值。 ```c char str[3] = {'H', 'i'}; // 无 \0,输出可能为 "Hi垃圾值" // 正确写法:char str[] = "Hi"; // 自动添加 \0 ``` ### 3. 指针输出的是地址而非内容 `%p` 输出指针变量存储的地址,而非指向的数据(需解引用)。 ```c 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`),功能简单。 ```c puts("Hello"); // 等价于 printf("Hello\n"); ``` - `fprintf(FILE* stream, ...)`:向指定文件输出(如文件、串口),`printf` 是 `fprintf(stdout, ...)` 的特例。 # 总结 `printf` 是 C 语言格式化输出的核心工具,通过格式说明符和修饰符可灵活控制输出样式。掌握其用法是编写 C 程序的基础,尤其要注意格式符与数据类型的匹配,避免因未定义行为导致的错误。 原文出处:http://www.malaoshi.top/show_1GW2DILj25RJ.html