背景
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"
其他
%% //輸出%