printf 是指格式化输出函数,主要功能是向标准输出设备按规定格式输出信息。printf 是C语言标准库函数,定义于头文件 <stdio.h>。printf 函数的一般调用格式为:printf("<格式化字符串>", <参量表>)1。输出的字符串除了可以是字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义2。
函数语法
函数声明
printf 函数的声明如下:
<pre data-lang="cpp">// 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
|| ||
示例代码:
<pre data-lang="cpp">// 以下程序用于输出各种格式化数据(其中 "\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: 4294958062Decimal -9234 as: Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756Characters in field: hReal numbers: 251.736600 251.74 2.517366e+002 2.517366E+002
- **flags(标志)**3
标志(flags)用于规定输出样式,含义如下:3
|| ||
示例代码:3
<pre data-lang="cpp">#include <stdio.h>#define PAGES 931int 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
|| ||
示例代码:3
<pre data-lang="cpp">#include <stdio.h>#define PAGES 931int 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
|| ||
示例代码:3
<pre data-lang="cpp">#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
|| ||
示例代码:3
<pre data-lang="cpp">#include <stdio.h>#define PAGES 336int 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() 使用的常见转义字符如下:
|| ||
示例代码:
<pre data-lang="cpp">#include <stdio.h>int main(void) { printf("This\nis\na\ntest\n\nShe said, \"How are you?\"\n"); return 0;}//程序运行结果:ThisisatestShe 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
来源: 百度百科
内容资源由项目单位提供