你現(xiàn)在可以創(chuàng)建不同類型的數(shù)組,并且也知道了“字符串”和“字節(jié)數(shù)組”是相同的東西。接下來,我們要更進一步,創(chuàng)建一個包含字符串的數(shù)組。我也會介紹第一個循環(huán)結構,for
循環(huán)來幫我們打印出這一新的數(shù)據(jù)結構。
這一章的有趣之處就是你的程序中已經(jīng)有一個現(xiàn)成的字符串數(shù)組,main
函數(shù)參數(shù)中的char *argv[]
。下面這段代碼打印出了所有你傳入的命令行參數(shù):
include <stdio.h>
int main(int argc, char *argv[])
{
int i = 0;
// go through each string in argv
// why am I skipping argv[0]?
for(i = 1; i < argc; i++) {
printf("arg %d: %s\n", i, argv[i]);
}
// let's make our own array of strings
char *states[] = {
"California", "Oregon",
"Washington", "Texas"
};
int num_states = 4;
for(i = 0; i < num_states; i++) {
printf("state %d: %s\n", i, states[i]);
}
return 0;
}
for
循環(huán)的格式是這樣的:
for(INITIALIZER; TEST; INCREMENTER) {
CODE;
}
下面是for
循環(huán)的工作機制:
INITIALIZER
中是用來初始化循環(huán)的代碼,這個例子中它是i = 0
。TEST
布爾表達式,如果為false
(0)則跳過CODE
,不做任何事情。CODE
,做它要做的任何事情。CODE
執(zhí)行之后會執(zhí)行INCREMENTER
部分,通常情況會增加一些東西,比如這個例子是i++
。TEST
為false
(0)為止。例子中的for
循環(huán)使用argc
和argv
,遍歷了命令行參數(shù),像這樣:
argv
數(shù)組,程序名稱./ex10
在下標為0的位置,剩余的參數(shù)緊隨其后。argc
置為argv
數(shù)組中參數(shù)的數(shù)量,所以你可以遍歷它們而不會越界。要記住如果你提供了一個參數(shù),程序名稱是第一個,參數(shù)應該在第二個。i < argc
測試i
是否使用argc
,由于最開始1 < 2
,測試通過。i
,并且將i
用做argv
的下標。i++
來運行自增語句,它是i = i + 1
的便捷形式。i < argc
值為false
(0),這時退出循環(huán)但程序仍然繼續(xù)執(zhí)行。你需要用兩種方法運行它來玩轉這個程序。第一種方法是向命令行參數(shù)傳遞一些東西來設置argc
和argv
。第二種是不傳入任何參數(shù),于是你可以看到第一次的for
循環(huán)沒有被執(zhí)行,由于i < argc
值為false
。
你應該可以從這個練習中弄明白,你在C語言中通過混合char *str = "blah"
和char str[] = {'b','l','a','h'}
語法構建二維數(shù)組來構建字符串數(shù)組。第十四行的char *states[] = {...}
語法就是這樣的二維混合結構,其中每個字符串都是數(shù)組的一個元素,字符串的每個字符又是字符串的一個元素。
感到困惑嗎?多維的概念是很多人從來都不會去想的,所以你應該在紙上構建這一字符串數(shù)組:
理解它的另一種方法是在你熟悉的語言,比如Python或Ruby中構建相同的結構。
i
初始化為0看看會發(fā)生什么。是否也需要改動argc
,不改動的話它能正常工作嗎?為什么下標從0開始可以正常工作?num_states
改為錯誤的值使它變大,來看看會發(fā)生什么。for
循環(huán)的每一部分你都可以放置什么樣的代碼。for
循環(huán)的每一部分中,';'
(分號)之間分隔多條語句。NULL
是什么東西,嘗試將它用做states
的一個元素,看看它會打印出什么。states
的一個元素賦值給argv
中的元素,再試試相反的操作。