一、printf()简介
printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出。标准输出,即标准输出文件,对应终端的屏幕。printf()申明于头文件stdio.h
函数原型:
int printf (const char * format,...);
返回值:
正确返回输出的字符总数,错误返回负值,与此同时,输入输出流错误标志将被置值,可由指示器ferror来检查输入输出流的错误标志。
调用格式:printf("格式控制字符串", 输出表列)
格式化字符串包含三种对象,分别为:
1、字符串常量
2、格式控制字符串
3、转义字符
字符串常量鸳鸯输出,在显示中起提示作用。输出表列中给出了各个输出项,要求格式控制字符串和各输出项在数量和类型上应该一一对应。其中格式控制字符串是以%开头的字符串,在%后跟有各种格式控制符,以说明输出数据的类型、宽度、精度等。
二、格式控制字符串详解
printf的格式控制字符串组成如下:
%[flags][width][.prec][length]type
分别为:
%[标志][最小宽度][.精度][类型长度]类型。
1、类型(type)
类型是格式控制字符串的重中之重,是必不可少的组成部分,其它的选项都是可选的。type用于规定输出数据的类型,含义如下:
数据类型 | 字符 | 含义 | 示例 |
int | d | 输出十进制有符号整数 | printf("%d",123);输出123 |
unsigned int | u | 输出无符号十进制整数 | printf("%u",123);输出123 |
float(doubule) | f / lf | 单精度浮点数用f 双精度浮点数用lf (printf可混用 scanf不可混用) | printf("%.9f %.9lf", 输出0.000000123 0.000000123,注意精度 否则printf默认精确到小数点后六位 |
char | c | 字符型。可以吧输入的数字按照ASCII码相应转换为对应的字符 | printf("%c\n",64);输出A |
char* | s | 字符串。输出字符串中的字符直至字符串中的空字符 (字符串一空字符'\0'结尾) | printf("%s","测试test"); 输出:测试test |
void* | p | 以16进制形式输出指针 | printf("%010p","lvlv") 输出:0x004007e6 |
字符% | % | 输出字符'%'本身 | printf("%%");输出:% |
2、标志(flags)
flags规定输出样式,取值和含义如下:
名称 | 字符 | 说明 |
减号 | - | 结果左对齐,右边填空格。默认是右对齐,左边填空格 |
加号 | + | 输出符号(正负号) |
空格 | space | 输出值为正时加上空格,为负时加上符号 |
井号 | # | type是o,x,X时,增加前缀0、0x、0X type是a,A,e,E,f,g,G,时,一定是用小数点。默认的,如果使用.0控制不输出小数部分,则不输出小数点 type是g、G时,尾部的0保留 |
数字零 | 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("%05d\n",1000); //前面补0
输出结果为:
3、精度(.precision)
精度格式符以”.“开头,后跟十进制正数。可取值如下:
十进制整数
1)、对于整形(d,i,o,u,x,X):precision表示输出的最小的数字个数,不足补前导零,超过不截断。
2)、对于浮点型(a,A,e,E,f),precision表示小数点后数值位数,默认为六位,不足补后置0,超过则截断。
3)、对于类型说明符g或G,表示可输出的最大有效数字
4)、对于字符串(s),precision表示最大可输出字符数,不足正常输出,超过则截断。
注意:在对浮点数和整数截断时,存在四舍五入
precision不现实指定,则默认为0
示例:
printf("%.8d\n",1000); //不足指定宽度补前导0,效果等同于%06d
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