printf 是指格式化输出函数,主要功能是向标准输出设备按规定格式输出信息。printf 是C语言标准库函数,定义于头文件 <stdio.h>。printf 函数的一般调用格式为:printf("<格式化字符串>", <参量表>)1。输出的字符串除了可以是字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义2。
函数语法
函数声明
printf 函数的声明如下:
// C99 前 int printf( const char *format, ... ); // C99 起 int printf( const char *restrict format, ... );
printf函数的一般格式
printf函数的一般格式为:printf(格式控制,输出表列)9
参数列表
格式控制(format),是格式控制字符串,简称格式字符串;其中包含了两种类型的对象:格式声明和普通字符9。
①格式声明由“%”和格式字符组成,如%d、%f等。它的作用是将输出的数据转换为指定的格式后输出。格式声明总是由“%”字符开始的。
②普通字符。普通字符即需要在输出时原样输出的字符。包括双撇号内的逗号、空格和换行符,也可以包括其他字符9。
printf 的格式控制字符串 format 中的转换说明组成如下,其中 [] 中的部分是可选的:
%[flags][width][.precision][length]specifier,即:%[标志][最小宽度][.精度][类型长度]说明符。转换说明详解见下文。
输出表列,程序需要输出的一些数据,可以是常量、变量或表达式。9
函数的附加参数即为个数和类型可变的输出列表9:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。1
使用printf时要注意一个问题 ,那就是输出列表中的求值顺序,不同的编译系统不一定相同,可以从左到右,也可从右到左。7

功能
printf 函数在输出格式 format 的控制下,将其参数进行格式化,并在标准输出设备(显示器、控制台等)上打印出来。1
返回值
如果函数执行成功,则返回所打印的字符总数,如果函数执行失败,则返回一个负数。3
函数说明及应用示例
转换说明详解
format 转换说明组成是%[flags][width][.precision][length]specifier,具体讲解如下:
说明符(specifier)1
说明符(specifier)用于规定输出数据的类型,含义如下:1
说明符(specifier) | 对应数据类型 | 描述 |
|---|---|---|
d / i | int | 输出类型为有符号的十进制整数,i 是老式写法 |
o | unsigned int | 输出类型为无符号八进制整数(没有前导 0) |
u | unsigned int | 输出类型为无符号十进制整数 |
x / X | unsigned int | 输出类型为无符号十六进制整数,x 对应的是 abcdef,X 对应的是 ABCDEF(没有前导 0x 或者 0X) |
f / lf | double | 输出类型为十进制表示的浮点数,默认精度为6(lf 在 C99 开始加入标准,意思和 f 相同) |
e / E | double | 输出类型为科学计数法表示的数,此处 "e" 的大小写代表在输出时用的 “e” 的大小写,默认浮点数精度为6 |
g | double | 根据数值不同自动选择 %f 或 %e,%e 格式在指数小于-4或指数大于等于精度时用使用1 |
G | double | 根据数值不同自动选择 %f 或 %E,%E 格式在指数小于-4或指数大于等于精度时用使用 |
c | char | 输出类型为字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 |
s | char * | 输出类型为字符串。输出字符串中的字符直至遇到字符串中的空字符(字符串以 '\0‘ 结尾,这个 '\0' 即空字符)或者已打印了由精度指定的字符数 |
p | void * | 以16进制形式输出指针 |
% | 不转换参数 | 不进行转换,输出字符‘%’(百分号)本身 |
n | int * | 到此字符之前为止,一共输出的字符个数,不输出文本 |
示例代码:
// 以下程序用于输出各种格式化数据(其中 "\n" 表示换行的转义字符,具体见下文的转义字符说明):
#include <stdio.h>
int main() {
char ch = 'h';
int count = -9234;
double fp = 251.7366;
// 显示整数
printf( "Integer formats:\n"
" Decimal: %d Unsigned: %u\n", count, count);
printf( "Decimal %d as:\n Hex: %Xh "
"C hex: 0x%x Octal: %o\n", count, count, count, count );
// 显示字符
printf("Characters in field:\n"
"%10c\n", ch);
// 显示实数
printf("Real numbers:\n %f %.2f %e %E\n", fp, fp, fp, fp );
return 0;
}
//程序运行结果:
Integer formats:
Decimal: -9234 Unsigned: 4294958062
Decimal -9234 as:
Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756
Characters in field:
h
Real numbers:
251.736600 251.74 2.517366e+002 2.517366E+002
flags(标志)3
标志(flags)用于规定输出样式,含义如下:3
flags(标志) | 字符名称 | 描述 |
|---|---|---|
- | 减号 | 在给定的字段宽度内左对齐,右边填充空格(默认右对齐) |
+ | 加号 | 强制在结果之前显示加号或减号(+ 或 -),即正数前面会显示 + 号; 默认情况下,只有负数前面会显示一个 - 号 |
(空格) | 空格 | 输出值为正时加上空格,为负时加上负号3 |
# | 井号 | specifier 是 o、x、X 时,增加前缀 0、0x、0X; specifier 是 e、E、f、g、G 时,一定使用小数点; specifier 是 g、G 时,尾部的 0 保留 |
0 | 数字零 | 对于所有的数字格式,使用前导零填充字段宽度(如果出现了减号标志或者指定了精度,则忽略该标志) |
示例代码:3
#include <stdio.h>
#define PAGES 931
int main() {
const double RENT = 3852.99; // const-style constant
printf("*%-10d*\n", PAGES); //左对齐,右边补空格
printf("*%+4.2f*\n", RENT); //输出正负号
printf("%x %X %#x\n", 31, 31, 31); //输出0x
printf("**%d**% d**% d**\n", 42, 42, -42); //正号用空格替代,负号输出
printf("**%5d**%5.3d**%05d**%05.3d**\n", 6, 6, 6, 6); //前面补0
return 0;
}
//程序运行结果:
*931 *
*+3852.99*
1f 1F 0x1f
**42** 42**-42**
** 6** 006**00006** 006**
width(最小宽度)3
最小宽度(width)用于控制显示字段的宽度,取值和含义如下:3
width(最小宽度) | 字符名称 | 描述 |
|---|---|---|
digit(n) | 数字 | 字段宽度的最小值,如果输出的字段长度小于该数,结果会用前导空格填充;如果输出的字段长度大于该数,结果使用更宽的字段,不会截断输出3 |
* | 星号 | 宽度在 format 字符串中规定位置未指定,使用星号标识附加参数,指示下一个参数是width |
示例代码:3
#include <stdio.h>
#define PAGES 931
int main() {
printf("*%2d*\n", PAGES); //输出的字段长度大于最小宽度,不会截断输出
printf("*%10d*\n", PAGES); //默认右对齐,左边补空格
printf("*%*d*\n", 2, PAGES); //等价于 printf("*%2d*\n",PAGES)
return 0;
}
//程序运行结果:
*931*
* 931*
*931*
.precision(精度)3
精度(.precision)用于指定输出精度,取值和含义如下:3
.precision(精度) | 字符名称 | 描述 |
|---|---|---|
.digit(n) | 点+数字 | 对于整数说明符(d、i、o、u、x、X):precision 指定了要打印的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符; 对于 e、E 和 f 说明符:要在小数点后输出的小数位数; 对于 g 和 G 说明符:要输出的最大有效位数; 对于 s 说明符:要输出的最大字符数。默认情况下,所有字符都会被输出,直到遇到末尾的空字符; 对于 c 说明符:没有任何影响; 当未指定任何精度时,默认为 1。如果指定时只使用点而不带有一个显式值,则标识其后跟随一个 0。3 |
.* | 点+星号 | 精度在 format 字符串中规定位置未指定,使用点+星号标识附加参数,指示下一个参数是精度 |
示例代码:3
#include <stdio.h>
int main() {
const double RENT = 3852.99; // const-style constant
printf("*%4.2f*\n", RENT);
printf("*%3.1f*\n", RENT);
printf("*%10.3f*\n", RENT);
return 0;
}
//程序运行结果:
*3852.99*
*3853.0*
* 3852.990*
length(类型长度)3
类型长度(length)用于控制待输出数据的数据类型长度,取值和含义如下:3
length(类型长度) | 描述 |
|---|---|
h | 参数被解释为短整型或无符号短整型(仅适用于整数说明符:i、d、o、u、x 和 X)3 |
l | 参数被解释为长整型或无符号长整型,适用于整数说明符(i、d、o、u、x 和 X)及说明符 c(表示一个宽字符)和 s(表示宽字符字符串)3 |
示例代码:3
#include <stdio.h>
#define PAGES 336
int main() {
short num = PAGES;
long n3 = 2000000000; long n4 = 1234567890;
printf("num as short and unsigned short: %hd %hu\n", num, num); printf("%ld %ld\n", n3, n4);
return 0;
}
//程序运行结果:
num as short and unsigned short: 336 336 2000000000 1234567890
转义序列
转义序列在字符串中会被自动转换为相应的特殊字符。printf() 使用的常见转义字符如下:
转义序列 | 描述 | ASCII 编码 |
|---|---|---|
\' | 单引号 | 0x27 |
\" | 双引号 | 0x22 |
\? | 问号 | 0x3f |
\\ | 反斜杠 | 0x5c |
\a | 铃声(提醒) | 0x07 |
\b | 退格 | 0x08 |
\f | 换页 | 0x0c |
\n | 换行 | 0x0a |
\r | 回车 | 0x0d |
\t | 水平制表符 | 0x09 |
\v | 垂直制表符 | 0x0b |
示例代码:
#include <stdio.h>
int main(void) {
printf("This\nis\na\ntest\n\nShe said, \"How are you?\"\n");
return 0;
}
//程序运行结果:
This
is
a
test
She said, "How are you?"
printf与其他标准库函数的主要区别
1. printf
printf函数用于将格式化的字符串输出到标准输出流(通常是计算机屏幕),即stdout。
例如:printf("Hello, World!\n"); 会将字符串 "Hello, World!" 输出到控制台。
2. fprintf
fprintf函数与printf函数相似,但输出到指定的文件流中。
例如:fprintf(stderr, "Error occurred!\n"); 会将字符串 "Error occurred!" 输出到标准错误流。
fprintf 可以指定输出到文件、标准输出、标准错误等。
3. sprintf
sprintf函数是printf函数的变体,它将输出存储在字符串中而不是打印出来。
例如:char buffer[100]; sprintf(buffer, "Value: %d", 10); 会将格式化后的字符串 "Value: 10" 存储到 buffer 数组中。
sprintf 不会检查目标缓冲区的大小,因此可能会导致缓冲区溢出。
4. snprintf
snprintf 函数用于将格式化的字符串输出到一个字符数组(字符串)中,并且可以指定目标缓冲区的大小,以避免缓冲区溢出。
例如:char buffer[100]; snprintf(buffer, sizeof(buffer), "Value: %d", 10); 会将格式化后的字符串 "Value: 10" 存储到 buffer 数组中,同时确保不会超出数组的大小。
snprintf 是 sprintf 的安全版本,推荐在需要格式化字符串到缓冲区时使用。
注意事项
函数返回值
printf 函数的返回值为其输出字符串常量的字符数(注意字符数与字数的区别),注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符)。3
打印较长字符串
有时printf 语句会很长,以至于不能在一行被放下,如果必须分割一个字符串,有以下三种方式可以选择。需要注意的是,可以在字符串中使用 "\n" 换行符来表示换行字符,但是在字符串中不能通过回车键来产生实际的换行字符。3
来源: 百度百科
内容资源由项目单位提供
科普中国公众号
科普中国微博

帮助
百度百科 