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

来源: 百度百科

内容资源由项目单位提供