
printf()是一种C语言标准库函数,用于将格式化的字符串输出到标准输出. 标准输出是标准输出文件,与终端的屏幕相对应. 在stdio.h头文件中声明了printf().
功能原型:
int printf ( const char * format, ... );
返回值: 返回正确输出的字符总数,并且错误返回负值. 同时,将设置输入和输出流错误标志. 指示器ferror可用于检查输入和输出流错误标志.
调用格式: printf()函数的调用格式为: printf(“格式字符串”,输出表列).
格式字符串包含三种类型的对象: (1)字符串常量; (2)格式控制字符串; (3)转义字符. 字符串常量按原样输出,并在显示中用作提示. 每个输出项目在输出表列中列出. 要求格式控制字符串和每个输出项目的编号和类型必须彼此对应. 格式控制字符串是一个以%开头的字符串,后跟各种格式控制字符,用于解释输出数据的类型,宽度和精度.
注意: 本文中的所有示例代码都是在Linux环境下使用g ++ 4.4.6编译成64位程序的.
printf的格式控制字符串组成如下:
%[flags][width][.prec][length]type
分别:
%[标志][最小宽度][.精度][类型长度]类型。
首先说明类型,因为类型是格式控制字符串中最重要的部分,并且是必不可少的组成部分. 其他选项是可选的. type用于指定输出数据的类型,含义如下:
对应的数据类型
输出十进制带符号的32位整数,我是旧式表示法
printf(“%i”,123);输出123
无符号八进制整数(无前缀0)
printf(“ 0%o”,123);输出0173
无符号十进制整数
printf(“%u”,123);输出123
无符号十六进制整数,x对应abcdef,X对应ABCDEF(不输出前缀0x)
printf(“ 0x%x 0x%X”,123,123);输出0x7b 0x7B
浮动(双精度)

F表示单精度浮点数,lf表示双精度浮点数(printf可以混合,但scanf不能混合)
printf(“%. 9f%.9lf”,0.000000123,0.000000123);输出0.000000123 0.000000123. 请注意指定的精度,否则printf默认将精确到小数点后六位
浮动(双精度)
与f相同,只是无穷大和nan以大写形式输出.
例如printf(“%f%F%f%F \ n”,INFINITY,INFINITY,NAN,NAN);输出是inf INF NAN NAN
浮动(双精度)
科学计数法,使用指数表示浮点数,其中输出中“ e”的情况表示“ e”的情况
printf(“%e%E”,0.000000123,0.000000123);输出1.230000e-07 1.230000E-07
浮动(双精度)
根据值的长度,选择以最短的方式输出%f或%e
printf(“%g%g”,0.000000123,0.123);输出1.23e-07 0.123
浮动(双精度)
根据值的长度,选择以最短的方式输出%f或%E
printf(“%G%G”,0.000000123,0.123);输出1.23E-07 0.123
字符. 输入的数字可以根据ASCII码转换为相应的字符.
printf(“%c \ n”,64)输出A
字符串. 输出字符串中的字符,直到字符串中的空字符(字符串以空字符'\ 0'结尾)
printf(“%s”,“测试测试”);输出: 测试
宽字符串. 输出字符串中的字符,直到字符串中的空字符为止(宽字符串以两个空字符'\ 0'结尾)
setlocale(LC_ALL,“ zh_CN.UTF-8”); wchar_t wtest [] = L“测试”; printf(“%S \ n”,wtest);输出: 测试
十六进制格式的输出指针
printf(“ 0p”,“ lvlv”);输出: 0x004007e6

什么都没有输出. 相应的%n参数是指向带符号的int的指针,之前输出的字符数将存储在指针所指向的位置
int num = 0; printf(“ lvlv%n”,&num); printf(“ num: %d”,num);输出: lvlvnum: 4
自行输出字符'%'(百分号)
printf(“ %%”);产量: %
打印与errno值相对应的错误内容
printf(“%m \ n”);
浮动(双精度)
十六进制表示法输出浮点数,a为小写,A为大写
printf(“%a%A”,15.15,15.15);输出: 0x1.e4ccccccccccdp + 3 0X1.E4CCCCCCCCCCDCCDP + 3
注意: (1)使用printf输出宽字符时,需要使用setlocale来指定本地化信息,还需要指定当前代码的编码方法. 除了使用%S外,您还可以使用%ls. (2)%a和%A是C99引入的格式化类型,它们使用十六进制p表示法输出浮点数. 该表示法类似于E科学表示法,但有所不同. 数字以0x开头,然后是十六进制浮点部分,然后是p之后的以2为底的顺序代码. 以15.15的输出为例,估计输出结果. 15.15转换为二进制是1111.00 1001 1001 1001 1001 ...,因为数字的二进制表示形式具有离散性,所以计算机有时不能准确地表示小数. 例如,可以将0.5精确地表示为0.120.120.1_2,但是不能精确地表示0.15. 将对应于15.15的二进制数向右移动三位数至1.1110 0100 1100 1100 1100 ...相应的十六进制数为0x1.e4ccccccccccd. 请注意,在四舍五入时,数字会四舍五入到一位. 由于它向右移动了三位,因此二进制顺序代码为3. 最终结果为0x1.e4ccccccccccccdp + 3.
(3)除了指示输出的数据类型外,格式控制字符串还可以按标志,宽度,.precision和长度的顺序包含一些其他可选的格式描述. 让我们一一解释.
flags指定输出样式. 值和含义如下:
结果是左对齐的,右边有空格. 默认值为右对齐,左侧为空格.
输出符号(正号或负号)
如果输出值为正,则添加一个空格;如果为负,则添加一个负号.
当类型为o,x,X时,添加前缀0、0x,0X. 当type为a,A,e,E,f,g或G时,请使用小数点. 默认情况下,如果使用.0控件不输出小数部分,则不输出小数点. 当type为g或G时,尾随0被保留.
在输出的前面附加0,直到它填充指定的列宽(不能与“-”一起使用)
示例:
printf("%5d\n",1000); //默认右对齐,左边补空格
printf("%-5d\n",1000); //左对齐,右边补空格
printf("%+d %+d\n",1000,-1000); //输出正负号
printf("% d % d\n",1000,-1000); //正号用空格替代,负号输出
printf("%x %#x\n",1000,1000); //输出0x
printf("%.0f %#.0f\n",1000.0,1000.0)//当小数点后不输出值时依然输出小数点
printf("%g %#g\n",1000.0,1000.0); //保留小数点后后的0
printf("d\n",1000); //前面补0
输出为:
代表要输出的最小位数,为十进制整数. 如果实际位数大于指定的宽度,则将其输出为实际位数. 如果实际位数小于定义的宽度printf输出数字,则用空格或0补充. 宽度的可能值如下:
十进制整数

printf(“ d”,1000);输出: 001000
星号. 不要显示指定的最小输出宽度,而应使用printf的输出参数列表中给出的星号
printf(“%0 * d”,6,1000);输出: 001000
精度格式字符以“. ”开头. 后跟一个十进制整数. 可能的值如下:
.precision
十进制整数. (1)对于整数(d,i,o,u,x,X),精度表示要输出的最小位数,小于前导零,超过则不截断. (2)对于浮点类型(a,A,e,E,f),精度表示小数点后的位数,默认为六位数,如果不足则设置为0,如果不足则设置为截断它超过了. (3)对于类型说明符g或G,可以输出的最大有效数字. (4)对于字符串,精度表示可以输出的最大字符数,如果小于正常输出,则将被截断. 精度不显示指定的值,默认为0
用一个星号代替值,宽度类似于*,并在输出参数列表中指定精度.
示例:
printf("%.8d\n",1000); //不足指定宽度补前导0,效果等同于d
printf("%.8f\n",1000.123456789);//超过精度,截断
printf("%.8f\n",1000.123456); //不足精度,补后置0
printf("%.8g\n",1000.123456); //最大有效数字为8位
printf("%.8s\n",“abcdefghij”); //超过指定长度截断
输出:
00001000 1000.12345679 1000.12345600 1000.1235 abcdefgh
请注意,在截断浮点数和整数时会四舍五入.
类型长度表示要输出的数据的长度. 因为同一个类型可以具有不同的长度,例如,整数类型具有16位的short int,32位的int和64位的long int,而浮点类型具有32位的单个精度float和64位的双精度. 为了指示相同类型的不同长度,类型长度应运而生,并成为格式控制字符串的一部分.
由于Markdown表不支持单元格合并,背景色和其他样式,因此直接引用了printf.C ++参考表.
注意: C99引入了类型长度说明符和由背景线标识的相应数据类型.
示例代码:
printf("%hhd\n",'A'); //输出有符号char
printf("%hhu\n",'A'+128); //输出无符号char
printf("%hd\n",32767); //输出有符号短整型short int
printf("%hu\n",65535); //输出无符号短整型unsigned short int
printf("%ld\n",0x7fffffffffffffff); //输出有符号长整型long int
printf("%lu\n",0xffffffffffffffff); //输出有符号长整型unsigned long int
输出:
65 193 32767 65535 9223372036854775807 18446744073709551615
注意: long int是32位还是64位对应于生成的程序32位还是64位. 如果使用g ++编译程序,则可以使用-m32或-m64选项分别生成32位和64位程序. 因为我的测试代码可以编译并生成64位程序,所以long int也是64btis.
转义字符会自动转换为字符串中的相应操作命令. printf()使用的常见转义字符如下:
在printf的实现中,在调用write(这是一个用户空间缓冲区)之前先写入IO缓冲区. 系统调用是软中断,频繁调用,并且需要频繁地进入内核模式. 这种效率不是很高,并且printf实际上写入用户空间IO缓冲区. 仅在满足条件时才调用写入系统调用,从而减少了IO的数量. ,提高效率.

printf默认为glibc中的行缓冲. 在以下情况下,它将刷新缓冲区并输出内容: (1)缓冲区已满; (2)书写字符具有换行符\ n或回车符\ r; (3)调用fflush手动刷新缓冲区; (4)调用scanf从输入缓冲区读取数据,它还将刷新输出缓冲区中的数据.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-157230-1.html
机巡航南海中国岛礁12海里