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

来源: 百度百科

内容资源由项目单位提供