這節(jié)是比較重要的,因為這節(jié)要是沒弄明白之后的函數(shù)實現(xiàn)理解起來就很麻煩熟妓,linux環(huán)境的函數(shù)雪猪,是怎么實現(xiàn)的,都會困難很多甚至完全理解不了起愈。
在支持C語言的環(huán)境中只恨,可以在程序開始執(zhí)行時將命令行傳遞給程序。調(diào)用主函數(shù)main時:
第一個參數(shù)(argc抬虽,用于參數(shù)計數(shù))的值表示運行程序時命令行中參數(shù)的數(shù)目官觅。
第二桿參數(shù)(argv,用于參數(shù)向量)是一個指向字符中數(shù)組的指針阐污,每個字符對應一個指針休涤。通常用多級指針處理這些字符串。
也就是說第一個參數(shù)是統(tǒng)計參數(shù)有多少的疤剑,第二個參數(shù)是指針滑绒,其所指的位置是具體的參數(shù)闷堡。
C語言約定,argv[0]的值是啟動該程序的程序名(就是說第一個參數(shù)就是這個程序的名稱).因此argc的值至少是1.如果argc的值是1,那么就說明程序名后面沒有參數(shù).第一個可選的參數(shù)是argv[1],因為argv[0]是參數(shù)名,約定不可更改.最后一個可選參數(shù)是argv[argc - 1].因為參數(shù)是從0開始計數(shù)的,所以需要總數(shù)減去1才是最后一個.另外ANSI標準要求argv[argc]就是最后一個參數(shù)后面必須是空指針0.
例子是將argv的元素除了程序名外(第0個元素)依次輸出疑故。后面那個(i < argc - 1) ? " " : "";的目的只是為了加個空格吧?
下面例子說難也沒多難杠览,一樣的東西,但是這個指向char類型的指針的指針有點拗口纵势。
argv→argv[i]→char類型
把argv當成一個指針,它指向的元素也是一個指針,而這個指針又指向了char類型.
這里完全是因為數(shù)組和指針是差不多一樣的,可以混用.所以才這樣.
理解了上面的那些基礎,之后這個例子就簡單了.
開頭一樣還是帶參數(shù)的.
然后就是那個line的指針數(shù)組,元素都是指向每個輸入行的首字符的指針.
判斷參數(shù)是不是等于2.等于2才是正確的參數(shù)數(shù)量,第一個是argc.
然后就是查找,先確定還存在未讀取的行.
然后將argv1與line對比.如果當前行沒有就返回NULL,如果有那么就繼續(xù).
將該行打印在屏幕上.
然后將計數(shù)變量加1.
返回包含參數(shù)字符的行數(shù)量.
UNIX系統(tǒng)中的C語言有一個公共的約定,以負號開頭的參數(shù)表示一個可選標志或參數(shù).
因為argv為指針數(shù)組踱阿,假設命令行參數(shù)為:eco hello world 所以:
1.++argv[0],[]優(yōu)先級最高钦铁,所以先取argv[0]的值软舌,argv[0]為字符串數(shù)組"ehco\0"的指針,然后指針自增++,再使用牛曹,即字符 c佛点。
2.(++argv)[0],即先(argv+1)取出argv[1]中的值黎比,argv[1]為字符串數(shù)組"hello\0"的指針超营,所以最后結果為字符 h。
兩者截然不同阅虫。
指針數(shù)組作為函數(shù)參數(shù)時演闭,函數(shù)將其作為指向指針的指針處理,因此可以自增
而自定義的指針數(shù)組實質(zhì)還是數(shù)組颓帝,對數(shù)組名自增運算是非法的.
這是摘自網(wǎng)上的兩段解釋,非常清楚的解釋了(++argv)[0]是想表達什么意思.
但是如果將之前的指針數(shù)組的元素都是字符串的首字符這點明確的話,這里應該也是比較好理解的.
因為上面那些原因所以可以對負號'-'進行對比.
之后就是多路判定,判斷參數(shù).
想了一會為啥argc要等于1,書上給了解釋,argc執(zhí)行自減運算,argv自增,到最后如果格式正確,即參數(shù)正確都是-開頭的情況下,到最后就是argc自減成1,變成只剩程序名一個,argc也走到了 參數(shù)后面需要查找的字符那里.
然后就是判斷輸出,不過加了一個lineno這個就是計數(shù)的沒循環(huán)一次加1并打印.
然后又個exceot是判斷是否輸出當前行的,參數(shù)有x的話之前except就被賦值為1,否則就是0,
找到這樣的行就是1,與except對比如果不是1就輸出,如果是0就不輸出.
然后判斷number 這個就是加個序號.
之前那個(++argv)[0]書上也有解釋.可以看一下.