練習(xí)3:格式化輸出
譯者:飛龍
不要?jiǎng)h除Makefile,因?yàn)樗梢詭湍阒赋鲥e(cuò)誤吴超,以及當(dāng)我們需要自動(dòng)化處理一些事情時(shí),可以向它添加新的東西鲸阻。
許多編程語(yǔ)言都使用了C風(fēng)格的格式化輸出者吁,所以讓我們嘗試一下:
#include <stdio.h>
int main()
{
int age = 10;
int height = 72;
printf("I am %d years old.\n", age);
printf("I am %d inches tall.\n", height);
return 0;
}
寫完之后加派,執(zhí)行通常的make ex3
命令來(lái)構(gòu)建并運(yùn)行它褂微。一定要確保你處理了所有的警告倒庵。
這個(gè)練習(xí)的代碼量很小陋守,但是信息量很大,所以讓我們逐行分析一下:
- 首先你包含了另一個(gè)頭文件叫做
stdio.h
水评。這告訴了編譯器你要使用“標(biāo)準(zhǔn)的輸入/輸出函數(shù)”。它們之一就是printf
之碗。 - 然后你使用了一個(gè)叫
age
的變量并且將它設(shè)置為10。 - 接著你使用了一個(gè)叫
height
的變量并且設(shè)置為72褪那。 - 再然后你使用
printf
函數(shù)來(lái)打印這個(gè)星球上最高的十歲的人的年齡和高度。 - 在
printf
中你會(huì)注意到你傳入了一個(gè)字符串友浸,這就是格式字符串,和其它語(yǔ)言中一樣收恢。 - 在格式字符串之后,你傳入了一些變量伦意,它們應(yīng)該被
printf
“替換”進(jìn)格式字符串中。
這些語(yǔ)句的結(jié)果就是你用printf
處理了一些變量驮肉,并且它會(huì)構(gòu)造出一個(gè)新的字符串,之后將它打印在終端上离钝。
你會(huì)看到什么
當(dāng)你做完上面的整個(gè)步驟,你應(yīng)該看到這些東西:
$ make ex3
cc -Wall -g ex3.c -o ex3
$ ./ex3
I am 10 years old.
I am 72 inches tall.
$
不久之后我會(huì)停下來(lái)讓你運(yùn)行make
慧域,并且告訴你構(gòu)建過(guò)程是什么樣子的。所以請(qǐng)確保你正確得到了這些信息并且能正常執(zhí)行昔榴。
外部研究
在附加題一節(jié)我可能會(huì)讓你自己查找一些資料,并且弄明白它們论泛。這對(duì)于一個(gè)自我學(xué)習(xí)的程序員來(lái)說(shuō)相當(dāng)重要蛹屿。如果你一直在自己嘗試了解問(wèn)題之前去問(wèn)其它人,你永遠(yuǎn)都不會(huì)學(xué)到獨(dú)立解決問(wèn)題错负。這會(huì)讓你永遠(yuǎn)都不會(huì)在自己的技能上建立信心勇边,并且總是依賴別人去完成你的工作。
打破你這一習(xí)慣的方法就是強(qiáng)迫你自己先試著自己回答問(wèn)題粒褒,并且確認(rèn)你的回答是正確的。你可以通過(guò)打破一些事情奕坟,用實(shí)驗(yàn)驗(yàn)證可能的答案,以及自己進(jìn)行研究來(lái)完成它刃跛。
對(duì)于這個(gè)練習(xí),我想讓你上網(wǎng)搜索printf
的所有格式化占位符和轉(zhuǎn)義序列桨昙。轉(zhuǎn)義序列類似\n
或者\r
,可以讓你分別打印新的一行或者 tab 蛙酪。格式化占位符類似%s
或者%d
,可以讓你打印字符串或整數(shù)滤否。找到所有的這些東西,以及如何修改它們藐俺,和可設(shè)置的“精度”和寬度的種類。
從現(xiàn)在開(kāi)始欲芹,這些任務(wù)會(huì)放到附加題里面,你應(yīng)該去完成它們菱父。
如何使它崩潰
嘗試下面的一些東西來(lái)使你的程序崩潰,在你的電腦上它們可能會(huì)崩潰浙宜,也可能不會(huì)。
- 從第一個(gè)
printf
中去掉age
并重新編譯同仆,你應(yīng)該會(huì)得到一大串的警告。 - 運(yùn)行新的程序俗批,它會(huì)崩潰市怎,或者打印出奇怪的年齡。
- 將
printf
恢復(fù)原樣区匠,并且去掉age
的初值,將那一行改為int age;
驰弄,之后重新構(gòu)建并運(yùn)行。
# edit ex3.c to break printf
$ make ex3
cc -Wall -g ex3.c -o ex3
ex3.c: In function 'main':
ex3.c:8: warning: too few arguments for format
ex3.c:5: warning: unused variable 'age'
$ ./ex3
I am -919092456 years old.
I am 72 inches tall.
# edit ex3.c again to fix printf, but don't init age
$ make ex3
cc -Wall -g ex3.c -o ex3
ex3.c: In function 'main':
ex3.c:8: warning: 'age' is used uninitialized in this function
$ ./ex3
I am 0 years old.
I am 72 inches tall.
$
附加題
- 找到盡可能多的方法使
ex3
崩潰什乙。 - 執(zhí)行
man 3 printf
來(lái)閱讀其它可用的'%'格式化占位符已球。如果你在其它語(yǔ)言中使用過(guò)它們辅愿,應(yīng)該看著非常熟悉(它們來(lái)源于printf
)忆某。 - 將
ex3
添加到你的Makefile
的all
列表中。到目前為止弃舒,可以使用make clean all
來(lái)構(gòu)建你所有的練習(xí)。 - 將
ex3
添加到你的Makefile
的clean
列表中聋呢。當(dāng)你需要的時(shí)候使用make clean
可以刪除它。