C語(yǔ)言之printf函數(shù)的用法
——TechZone(Harris)
? printf所坯,即格式化輸出,是C語(yǔ)言中常用的輸出函數(shù)宪迟。本節(jié)內(nèi)容咱們就來(lái)講講關(guān)于這個(gè)函數(shù)的一些用法贼陶。
? 我們?cè)凇?a href="http://www.reibang.com/p/7c1e13f21335" target="_blank">第一個(gè)C語(yǔ)言程序》中有粗略地提到了printf函數(shù)送挑,小伙伴們應(yīng)該也對(duì)這個(gè)函數(shù)有了一個(gè)大致的了解,大概知道了是用來(lái)輸出數(shù)據(jù)用的午笛。但是渣刷,我們既然說(shuō)它是個(gè)函數(shù)鱼辙,那么就應(yīng)該有挺多豐富的用法等著我們來(lái)發(fā)掘。那我們就一起來(lái)看看到底有哪些方法玫镐。
初窺門(mén)徑
? 我們還是從那個(gè)最簡(jiǎn)單的C語(yǔ)言程序開(kāi)始:
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}
printf函數(shù)有個(gè)括號(hào)倒戏,那么這個(gè)函數(shù)的所有參數(shù)都是放在這個(gè)括號(hào)里面的。什么意思呢恐似,printf這個(gè)函數(shù)就像是一個(gè)工具杜跷,這個(gè)工具有許許多多的功能。如何去設(shè)置這個(gè)工具矫夷,讓它達(dá)到我們想要的效果葛闷,就只需要把我們的想法寫(xiě)在括號(hào)里就完事兒啦。
? 但是呢双藕,這個(gè)工具并沒(méi)有搭載目前最新最火的人工智能孵运,比如你這么寫(xiě)
printf(讓"Hello, world!\n"這個(gè)東西給勞資居中)
,這樣肯定不行蔓彩,因?yàn)閜rintf看不懂呀治笨。只有寫(xiě)出它看得懂的東西,它才會(huì)聽(tīng)話赤嚼,乖乖給我們工作旷赖。你要是說(shuō)些它聽(tīng)不懂的,那它就直接罷工不干啦更卒,你就跟老板解釋去吧等孵!(printf:別說(shuō)人話了,我聽(tīng)不懂)
正式開(kāi)始
? 既然想要函數(shù)聽(tīng)懂我們?cè)谡f(shuō)什么蹂空,就要遵循它的方式俯萌。那么我們先來(lái)了解下printf的通式:
printf(輸出框架*格式化設(shè)置,附加參數(shù))
參數(shù)解析
-
輸出框架
? 我們上面那個(gè)
printf("Hello, world!\n")
中,就只用到了輸出框架這一個(gè)參數(shù)上枕。有的小伙伴可能會(huì)問(wèn)了咐熙,我們看到的全部?jī)?nèi)容不就是引號(hào)里面的嗎?咋叫框架呢辨萍?? 其實(shí)不然棋恼,我們還只用了一個(gè)參數(shù),別急锈玉,后面大家就知道啦爪飘。
-
格式化設(shè)置
? 這個(gè)星號(hào)其實(shí)是沒(méi)有的,這里只是告訴大家這兩個(gè)參數(shù)之間是連接起來(lái)的拉背,不需要空格师崎。
? 此處的語(yǔ)法通式為:
%[標(biāo)志] [寬度] [精度] [長(zhǎng)度修飾符] 轉(zhuǎn)換字符
? 其中,帶中括號(hào)的是可選參數(shù)椅棺,不帶的是必選參數(shù)犁罩。
-
轉(zhuǎn)換字符:
字符 含義 c char齐蔽;字符 d int;帶符號(hào)的十進(jìn)制整數(shù) i 同上 e double昼汗;以指數(shù)形式輸出單、雙精度浮點(diǎn)數(shù) E 同上 f double鬼雀;以小數(shù)的形式輸出單顷窒、雙精度浮點(diǎn)數(shù)(指數(shù)顯示小寫(xiě)e) g double;以%f或%e中較短的一種方式輸出單源哩、雙精度浮點(diǎn)數(shù)(指數(shù)顯示小寫(xiě)e) G 同上鞋吉,指數(shù)顯示大寫(xiě)E o unsigned int;無(wú)符號(hào)八進(jìn)制(無(wú)前導(dǎo)0) s char励烦;字符串 u int谓着;無(wú)符號(hào)十進(jìn)制 x unsigned int;無(wú)符號(hào)十六進(jìn)制(無(wú)前導(dǎo)0x) X 同上(無(wú)前導(dǎo)0X) p void坛掠;指針值 n int赊锚;用于存放已寫(xiě)字符的個(gè)數(shù)到變量,不用于輸出 % 不進(jìn)行參數(shù)轉(zhuǎn)換屉栓;%本身
-
-
標(biāo)志:
標(biāo)志 含義 - 指定被轉(zhuǎn)換的參數(shù)在其字段內(nèi)左對(duì)齊(默認(rèn)是右對(duì)齊) + 給數(shù)加上正負(fù)號(hào) [空格] 若非負(fù)數(shù)則加上空格 0 對(duì)于數(shù)值轉(zhuǎn)換舷蒲,當(dāng)輸出長(zhǎng)度小于字段寬度時(shí),添加前導(dǎo)0補(bǔ)充 # 指定另一種輸出方式
1. 若轉(zhuǎn)換字符為o友多,則第一個(gè)數(shù)為0
2. 若轉(zhuǎn)換字符為x或X牲平,則在輸出的非零值前加0x或0X
3. 對(duì)于轉(zhuǎn)換字符為e、E域滥、f纵柿、g或G,則輸出的數(shù)總包含一個(gè)小數(shù)點(diǎn)启绰。
另外昂儒,對(duì)于轉(zhuǎn)換字符g或G,還將尾部無(wú)意義的0保留 -
寬度:
轉(zhuǎn)換后的參數(shù)輸出寬度至少達(dá)到這個(gè)值委可,若不足則在左邊或右邊填補(bǔ)空格或者0荆忍。具體看標(biāo)志的設(shè)置,若無(wú)撤缴,默認(rèn)左邊填充空格刹枉。
-
精度:
這里要聲明一下,只有這個(gè)參數(shù)前面是要加點(diǎn)號(hào)"."來(lái)分隔的屈呕,
對(duì)于字符串微宝,它指定打印的字符的最大個(gè)數(shù)。
對(duì)于整數(shù)虎眨,它指定打印字符的位數(shù)蟋软,必要時(shí)加0來(lái)填補(bǔ)镶摘。
對(duì)于轉(zhuǎn)換字符為e、E或f岳守,它指定打印的小數(shù)點(diǎn)后的數(shù)字位數(shù)凄敢。
對(duì)于轉(zhuǎn)換字符為g或G,它指定打印的有效數(shù)字位數(shù)湿痢。
-
長(zhǎng)度修飾符:
修飾符 含義 hh 按signed char或unsigned char類(lèi)型輸出 h 按short或unsignedshort輸出 l 按long或unsigned long輸出 ll 按long long或者unsigned long long輸出 L 按long double類(lèi)型輸出
-
附加參數(shù)
所謂附加參數(shù)涝缝,筆者也不做過(guò)多解釋。假設(shè)我有一個(gè)變量c譬重,在
int c=3
之后拒逮,我想要輸出c的值,該怎么辦呢臀规?有的小伙伴很聰明滩援,立馬說(shuō),Harris塔嬉!我知道玩徊,這樣不就行了:
#include <stdio.h> int main(void) { int c=3; printf("C=3\n"); return 0; }
是的,這樣做沒(méi)錯(cuò)谨究。我們的確正確輸出了整型變量c的值佣赖。但是,我們寫(xiě)程序记盒,很多時(shí)候時(shí)為了方便不懂程序的人來(lái)使用的憎蛤。我們知道c的值,那是因?yàn)槲覀兛吹枚a纪吮。
如果我要你輸出剛才用戶(hù)輸入的值俩檬,你怎么辦呢?那么這個(gè)時(shí)候碾盟,附加參數(shù)就大顯神威了棚辽。
#include <stdio.h>
int main(void)
{
int c=3;//這里假定用戶(hù)已經(jīng)輸入了值
printf("C的值為%d",c);
return 0;
}
看到了吧。這里就把動(dòng)態(tài)的變量c嵌入到語(yǔ)句里面輸出了冰肴。
看到這里我相信小伙伴們應(yīng)該也明白了為啥我之前說(shuō)引號(hào)里面的是框架了屈藐。這就是所謂的格式化輸出,是不是有點(diǎn)只可意會(huì)不可言傳的感覺(jué)呢熙尉?
今天的內(nèi)容基本就到這里結(jié)束啦联逻。不過(guò)Harris在這里給大家留個(gè)懸念,大家可以自己回去自己的編譯器上實(shí)驗(yàn)一下检痰,看看能不能理解輸出的結(jié)果包归?具體原理以后會(huì)講,所以不理解沒(méi)關(guān)系铅歼,學(xué)好上面的內(nèi)容就很棒啦公壤!
#include <stdio.h>
int main(void)
{
char C = 'c';
printf("%c=%d",C,C);
return 0;
}