C语言:printf()函数

介绍

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 程序的基础,尤其要注意格式符与数据类型的匹配,避免因未定义行为导致的错误。