printf()用来格式化字符串
printf(格式串,表达式1,表达式2,······)
格式串是必须要传入的值,而后面的表达式只是根据需求追加的
格式串:也就是我们要显示的字符串,格式串可以是存粹的字符串常量,或者含有转换符的字符串常量
转换符:转换符就是打印格式串的占位字符,以%开头,%与后面的字母指定了将后面的表达式从二进制转化为字符的方式
表达式n:表达式是我们想插入在字符串中的自适应内容,从左到右依次替换到转换符上,它可以是变量,也可以为一些复杂的表达式
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
float c = 45.0f;
float d = 40.0f;
printf("a = %d, b = %d , c = %f , d = %f \n",a,b,c,d);
return 0;
}
输出结果为
a = 10, b = 20 , c = 45.000000 , d = 40.000000
其中%d就是int类型的转换符,%f是float类型的转换符
注意!!!
如果要在格式串中插入转换符来显示格式串和表达式拼接的效果,必须要保证转换符与表达式的一一对应。
如:
1.在打印int型变量使用了%f,就会打印出一个无意义的数,其他类型也是如此。
2.在格式串中加入了3个转换符,但后边的表达式只有1个,那么只有第1个转换符会被转换为有效值,而第2、3个会变为无效值。
3.在格式串中加入了1个转换符,但后面的表达式却又是3个,那么只会将表达式1的值替换到转换符上。
总结:使用printf()格式化输入时,要么只输出格式串,要么就要保证表达式列表如转换符一一对应。
转换符的最小栏宽和精度
%m.pX
%X:共同组成一个简单的转换符,如int的转换符%d,float的转换符%f
m:m就是最小栏宽(minimum field width)最小栏宽就是为表达式转化为转换符时能显示的最小字符数
比如,当前我们要显示int型123
我们使用%5d时,他会将123输出为
123
也就是说会将数字右对齐后,用空格补齐左边的空位以达到m长度,当然,如果int数字的长度小于m,则只显示123,不会截断数字
如我们使用%1d输出int型123,得到的结果会是
123
如果这个类型是float,那会优先为float补齐6个小数位,没有数字会优先补0
如果m为负数,会变为左对齐,向右边补空格
如下,我们在转换符后面紧贴字母方便观察
#include <stdio.h>
int main()
{
int a = 123;
printf("a = %-5daaa \n",a);
return 0;
}
输出
a = 123 aaa
可以看出,明显多了两个空位
.p:精度(precision) .和p共同组成精度
精度这个具体还要根据转换符类型区分
int型使用精度:当前转换符是%d(10进制整数),那么就相当于栏宽的作用,区别是栏宽补齐的是空格,而精度补齐的是0;
如果用%.5d输出int值123的出的会是
00123
同理,如果精度小于10进制数字长度,也只会显示数字本身
float型使用精度:当前转换符时%f(浮点型数)
会显示小数点后面p位,打印浮点型数,如果不写精度,默认显示6位。
转义序列(escape sequence)
\+任意字母或者符号
常见的如
\n:换行
\t:水平制表符
实际开发中不建议直接使用printf()输出log,会显得log信息很混乱,尽量封装成一个函数,便于log的筛选和模块信息区分,并且非测试阶段不要大量使用log,会影响系统性能,建议同时采用宏开关,在产品上线后关闭不必要的log,实现灵活打印。
printf常见的坑
1.printf()是一个非常消耗性能的log输出函数,当我们某一个函数对性能要求非常高时,或存在大量的循环调用、递归,这种情况下printf的耗时将会变得非常可观,所以当我们如果想测试一个函数的性能时,千万不要在函数内部进行printf()输出,printf()的高耗时会导致你测出的时间要长很多,会误导你认为自己的方案不行,其实有可能你的方案本身已经足够优秀了
正确的做法是应该在函数进入前记录系统毫秒值,出函数时记录系统毫秒值,计算进出函数的时间差来计算算法的实际耗时
如在Windows系统下:
#include <windows.h>
#include <stdio.h>
int main() {
int timerStart, timerStop;
timerStart = GetTickCount();
//耗时操作
timerStop = GetTickCount();
printf("times == %d ms\n", timerStop - timerStart);
return 0;
}
2.printf用在C++使用上打印值并不好用,因为C++可以向下兼容C,但C无法向上兼容C++,如果想在C++中使用printf(),还是要注意的,我的建议是,C++中 就不要输出printf(),直接使用 cout
#include <iostream>
#include <bitset>
using namespace std;
static bitset<sizeof(int)*8> a;
int main()
{
a[0] = 1;
cout<<"cout a1 == "<<a[0]<<endl;
printf("printf a1 == %d \n",a[0]);
return 0;
}
输出为
cout a1 == 1
printf a1 == 6422152