練習3:格式化輸出
譯者:飛龍
不要刪除Makefile,因為它可以幫你指出錯誤,以及當我們需要自動化處理一些事情時,可以向它添加新的東西。
許多編程語言都使用了C風格的格式化輸出,所以讓我們嘗試一下:
#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;
}
寫完之后,執行通常的make ex3
命令來構建并運行它。一定要確保你處理了所有的警告。
這個練習的代碼量很小,但是信息量很大,所以讓我們逐行分析一下:
- 首先你包含了另一個頭文件叫做
stdio.h
。這告訴了編譯器你要使用“標準的輸入/輸出函數”。它們之一就是printf
。 - 然后你使用了一個叫
age
的變量并且將它設置為10。 - 接著你使用了一個叫
height
的變量并且設置為72。 - 再然后你使用
printf
函數來打印這個星球上最高的十歲的人的年齡和高度。 - 在
printf
中你會注意到你傳入了一個字符串,這就是格式字符串,和其它語言中一樣。 - 在格式字符串之后,你傳入了一些變量,它們應該被
printf
“替換”進格式字符串中。
這些語句的結果就是你用printf
處理了一些變量,并且它會構造出一個新的字符串,之后將它打印在終端上。
你會看到什么
當你做完上面的整個步驟,你應該看到這些東西:
$ make ex3
cc -Wall -g ex3.c -o ex3
$ ./ex3
I am 10 years old.
I am 72 inches tall.
$
不久之后我會停下來讓你運行make
,并且告訴你構建過程是什么樣子的。所以請確保你正確得到了這些信息并且能正常執行。
外部研究
在附加題一節我可能會讓你自己查找一些資料,并且弄明白它們。這對于一個自我學習的程序員來說相當重要。如果你一直在自己嘗試了解問題之前去問其它人,你永遠都不會學到獨立解決問題。這會讓你永遠都不會在自己的技能上建立信心,并且總是依賴別人去完成你的工作。
打破你這一習慣的方法就是強迫你自己先試著自己回答問題,并且確認你的回答是正確的。你可以通過打破一些事情,用實驗驗證可能的答案,以及自己進行研究來完成它。
對于這個練習,我想讓你上網搜索printf
的所有格式化占位符和轉義序列。轉義序列類似\n
或者\r
,可以讓你分別打印新的一行或者 tab 。格式化占位符類似%s
或者%d
,可以讓你打印字符串或整數。找到所有的這些東西,以及如何修改它們,和可設置的“精度”和寬度的種類。
從現在開始,這些任務會放到附加題里面,你應該去完成它們。
如何使它崩潰
嘗試下面的一些東西來使你的程序崩潰,在你的電腦上它們可能會崩潰,也可能不會。
- 從第一個
printf
中去掉age
并重新編譯,你應該會得到一大串的警告。 - 運行新的程序,它會崩潰,或者打印出奇怪的年齡。
- 將
printf
恢復原樣,并且去掉age
的初值,將那一行改為int age;
,之后重新構建并運行。
# 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
崩潰。 - 執行
man 3 printf
來閱讀其它可用的'%'格式化占位符。如果你在其它語言中使用過它們,應該看著非常熟悉(它們來源于printf
)。 - 將
ex3
添加到你的Makefile
的all
列表中。到目前為止,可以使用make clean all
來構建你所有的練習。 - 將
ex3
添加到你的Makefile
的clean
列表中。當你需要的時候使用make clean
可以刪除它。