目录
一、基本用法
printf() 函数用于将参数文本输出到屏幕。函数名中的"f"代表"format"(格式化),表示该函数可以定制输出文本的格式。
基本语法示例:
#include <stdio.h>
int main()
{
printf("Hello World");
return 0;
}
上述代码会在屏幕上输出一行文字"Hello World"。
注意事项:
printf() 不会自动在行尾添加换行符。运行结束后,光标会停留在输出结束的位置,不会自动换行。
如需换行,可以在输出文本的结尾添加换行符\n:
#include <stdio.h> int main() { printf("Hello World\n"); return 0; }
若需要在文本内部换行,同样可以通过插入换行符实现:
#include <stdio.h> int main() { printf("Hello\nWorld\n"); /* 等价于 */ printf("Hello\n"); printf("World\n"); return 0; }
重要说明:
printf() 函数定义在标准库头文件stdio.h中
使用该函数前,必须在源文件头部引入此头文件
二、占位符
printf()
函数支持在输出文本中使用占位符,这些占位符可以在运行时被具体的值替换。
基本用法
#include <stdio.h>
int main()
{
printf("There are %d apples\n", 3);
return 0;
}
说明:
There are %d apples\n
是输出文本,其中%d
是占位符。占位符以百分号
%
开头,后跟一个类型标识符(如d
表示整数)。printf()
的第二个参数3
会替换%d
,最终输出:There are 3 apples
常用占位符
占位符 | 类型 | 示例 |
---|---|---|
%d |
整数 | printf("%d", 10) |
%s |
字符串 | printf("%s", "abc") |
%f |
浮点数 | printf("%f", 3.14) |
%c |
单个字符 | printf("%c", 'A') |
字符串占位符示例
#include <stdio.h>
int main()
{
printf("%s will come tonight\n", "zhangsan");
return 0;
}
输出:zhangsan will come tonight
多占位符示例
#include <stdio.h>
int main()
{
printf("%s says it is %d o'clock\n", "lisi", 21);
return 0;
}
说明:
第一个
%s
被"lisi"
替换第二个
%d
被21
替换
输出:lisi says it is 21 o'clock
注意事项
参数匹配规则:
占位符数量必须与后续参数数量严格匹配。
如果有
n
个占位符,printf()
需要n + 1
个参数(包括格式字符串本身)。
错误示例:此类错误可能导致未定义行为(输出乱码或程序崩溃)。
printf("%d %s", 10); // 错误:缺少第二个参数
三、占位符列表
printf()
提供多种占位符,对应不同的 C 语言数据类型。以下是常用占位符的完整参考:
基本数据类型占位符
占位符 | 类型 | 说明 | 示例 |
---|---|---|---|
%d |
int |
十进制整数 | printf("%d", 10) |
%i |
int |
同%d |
printf("%i", 10) |
%u |
unsigned int |
无符号十进制整数 | printf("%u", 10U) |
%o |
int |
八进制整数 | printf("%o", 10) |
%x |
int |
十六进制整数(小写) | printf("%x", 255) → ff |
%X |
int |
十六进制整数(大写) | printf("%X", 255) → FF |
浮点数占位符
占位符 | 类型 | 说明 |
---|---|---|
%f |
float/double |
十进制浮点数 |
%e |
float/double |
科学计数法(小写e) |
%E |
float/double |
科学计数法(大写E) |
%g |
float/double |
自动选择%f 或%e (更简洁) |
%G |
float/double |
自动选择%f 或%E |
%a |
float/double |
十六进制浮点数(小写) |
%A |
float/double |
十六进制浮点数(大写) |
特殊类型占位符
占位符 | 类型 | 说明 |
---|---|---|
%c |
char |
单个字符 |
%s |
char* |
字符串 |
%p |
void* |
指针地址 |
%n |
int* |
不打印,存储已输出的字符数 |
%% |
- | 输出百分号字符 |
长度修饰符
可与基本占位符组合使用:
h
:short
(如%hd
)l
:long
(如%ld
)ll
:long long
(如%lld
)L
:long double
(如%Lf
)z
:size_t
(如%zd
)
使用示例
#include <stdio.h>
int main()
{
// 基本整数
printf("Decimal: %d\n", 255); // 255
printf("Octal: %o\n", 255); // 377
printf("Hex: %x\n", 255); // ff
// 浮点数
printf("Float: %f\n", 3.14159); // 3.141590
printf("Scientific: %e\n", 3.14159); // 3.141590e+00
// 特殊类型
printf("Character: %c\n", 'A'); // A
printf("String: %s\n", "Hello"); // Hello
printf("Pointer: %p\n", main);
return 0;
}
注意事项
类型必须严格匹配占位符
使用
%n
时要格外小心(可能引发安全问题)%%
用于输出百分号字符本身
四、输出格式
printf() 可以定制占位符的输出格式。
1、限定宽度
printf()
函数允许通过格式说明符限定输出的最小宽度。具体用法如下:
基本用法
在占位符中指定最小宽度,当输出内容不足该宽度时,默认会在左侧填充空格(右对齐)。
示例:
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 输出为 " 123"(前面有2个空格)
return 0;
}
说明:
%5d
表示该整数的输出宽度至少为5个字符由于"123"只有3位,不足部分会在前面补2个空格
左对齐输出
在宽度指示符前添加-
号可以改为左对齐(右侧补空格)。
示例:
#include <stdio.h>
int main()
{
printf("%-5d\n", 123); // 输出为 "123 "(后面有2个空格)
return 0;
}
浮点数宽度限制
对于浮点数,宽度限制会作用于整个数字(包括整数部分、小数点和小数部分)。
示例:
#include <stdio.h>
int main()
{
printf("%12f\n", 123.45); // 输出为 " 123.450000"
return 0;
}
说明:
%12f
表示浮点数至少占用12个字符宽度默认情况下,
printf()
会输出6位小数,因此实际输出为"123.450000"(共10个字符)不足12位,所以在前面补2个空格
注意:当实际数值的宽度超过指定的最小宽度时,会按照实际宽度输出,不会截断数据。
2、强制显示正负号
默认情况下,printf()
仅在输出负数时显示 -
号。若需强制显示正数的 +
号,可在占位符的 %
后添加 +
标志。
示例:
#include <stdio.h>
int main()
{
printf("%+d\n", 12); // 输出 "+12"
printf("%+d\n", -12); // 输出 "-12"
return 0;
}
说明:
%+d
格式确保数值始终带有符号标识适用于需要明确区分正负值的场景
3、控制小数精度
基本精度控制
通过 %.nf
格式可指定小数位数(n 为要保留的位数):
#include <stdio.h>
int main()
{
printf("Number is %.2f\n", 0.5); // 输出 "Number is 0.50"
return 0;
}
注意:
会自动进行四舍五入
不足位数补零(如
%.3f
输出 "0.500")
结合宽度限制
可同时指定宽度和精度(格式:%宽度.精度f
):
#include <stdio.h>
int main()
{
printf("%6.2f\n", 0.5); // 输出 " 0.50"(头部2空格)
return 0;
}
说明:
%6.2f
表示总宽度6字符,含2位小数默认右对齐,不足宽度左侧补空格
动态参数指定
使用 *
占位符可通过参数动态设置宽度和精度:
#include <stdio.h>
int main()
{
printf("%*.*f\n", 6, 2, 0.5); // 等效于 printf("%6.2f\n", 0.5)
return 0;
}
特点:
第一个
*
对应宽度参数(示例中的6)第二个
*
对应精度参数(示例中的2)提高代码灵活性,适合需要运行时确定格式的场景
4、截断字符串输出
printf()
函数可以通过 %.ns
格式说明符来控制字符串的输出长度,其中 n
指定要显示的最大字符数。
基本用法
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello world"); // 输出 "hello"
return 0;
}
说明:
%.5s
表示只输出字符串的前5个字符原字符串 "hello world" 被截断为 "hello"
不会修改原字符串,仅控制输出内容
特点
安全截断:不会导致缓冲区溢出
精确控制:可指定任意截取长度(不超过字符串实际长度)
格式灵活:可与最小宽度结合使用(如
%10.5s
)
结合宽度限定
#include <stdio.h>
int main()
{
printf("%10.5s\n", "hello world"); // 输出 " hello"(右对齐)
printf("%-10.5s\n", "hello world"); // 输出 "hello "(左对齐)
return 0;
}
注意:
当截取长度超过字符串实际长度时,按实际字符串长度输出
常用于格式化表格输出或固定长度显示场景