C++之printf函数
背景
C++中可以使用cout来输出。
但是cout输出一些格式化的数据非常麻烦。
比如:
hour,min和sec代表当前时间,需求:按12:00:00格式输出当前时间。
//使用cout输出
cout<<hour<<":"<<min<<":"<<sec<<endl;
问题:
- 这样输出比较麻烦,代码的阅读性也不高。
- 如果min是个位数,前面不方便加0。
Printf示例
//使用printf输出上面的问题
print("%d:%0.2d:%0.2d",hour,min,sec);
解释:
上面代码在熟悉时候阅读性高。
printf的第一个参数是字符串,字符串表示输出格式。
%d表示数据,从第2个参数开始,依次替换字符串中的%d。
%0.2d表示,如果数据是个位数,依旧输出两位数(在前面加0)。
Printf详解
从上面的例子可以看到,变量负责存储数据。
但是有的时候,同样的数据我们希望得到不同格式的输出。比如早上七点01分,使用cout就会变成7:1,我们希望得到的是7:01。
所以变量负责存储数据,printf负责格式输出。(同样的值可以得到不同格式输出)。
整数
占位符
%d //输出十进制
%o //输出无符号整数的八进制
%x //输出无符号整数的十六进制(字母小写)
%X //输出无符号整数的十六进制(字母大写)
格式
%5d //输出宽度为5(右对齐)
%-5d //输出宽度为5(左对齐)
%+5d //输出宽度为5(输出符号)
%05d //输出宽度为5(前面补0,而不是空格)
%#o //输出八进制前的0(进制前的标识符)
%#x //输出十六进制前的0x(进制前的标识符)
举例
例1:
int a=12;
printf("%d\n",a); //输出12
例2:
int a=12;
printf("%o\n",a); //输出14(因为十进制的12等于八进制的14)
例3:
int a=12;
printf("%x\n",a); //输出c(因为十进制的12等于十六局进制的c)
例4:
int a=12;
printf("%5d\n",a); //输出" 12"(默认右对齐,总共5个占位,前面补空格)
例5:
int a=12;
printf("%-5d\n",a); //输出"12 "(负号表示左对齐,总共5个占位,后面补空格)
例6:
int a=-12;
printf("%+5d\n",a); //输出" -12"(正号表示输出符号,而不是在前面加"+")
例7:
//%02d表示输出宽度为2,不足2则在前面补0。比如表示时间的时候:
int hour=12,min=3,sec=2;
printf("%02d:%02d:%02d\n",hour,min,sec); //输出"12:03:02"
小数
占位符
%f //输出小数(保留到小数点后6位)
%e,E //科学计数法,保留到小数点后6位(1.234560e+02)
%g,G //以%f或%e中较短的输出宽度输出小数
格式
%10f //输出宽度为10(多出不会被截断)
%10.3f //输出宽度为10(保留到小数点后3位)
举例
例1:
float a=1.2;
printf("%f\n",a); //输出1.200000
例2-科学计数法:
float a=1234567;
printf("%e\n",a); //输出1.234567e+06
//%e和%E分别表示用小写和大写的e表示
例3
当我们不知道变量用什么方式表示时,可以用%g表示。
比如,1.2如果用科学计数法来表示会非常繁琐:1.200000e+00
再比如,1234567用%f也会繁琐:1234567.000000
那么,用%g就能自动判断,以更好的方式表示。
float a=1234567,b=1.2;
printf("a=%g\n",a); //输出a=1.23457e+06
printf("b=%g\n",b); //输出b=1.2
char
占位符
%c //输出单个字符
%s //输出字符串
举例
例1:
int a=65;
printf("%d\n",a); //输出65
printf("%c\n",a); //输出A
例2:
char * a="张三";
printf("我的名字是%s\n",a); //输出"我的名字是张三"
指针
%p //输出指针指向的地址
举例:
int a=10;
int *p=&a;
printf("变量a的地址为%p\n",p); //输出"变量a的地址为0x7ffeefbff54c"
其他
%% //输出%