多級指標的應用一(字串的切割)

2021-08-07 13:35:43 字數 2088 閱讀 8519

c語言中指標,可以算是最靈活,最強大的地方,同時也是最艱深的地方。用不好的話,什麼段錯誤,記憶體違例等以前沒見過的東西都會跳出來。最近看《unix系統程式設計》,感覺能把c語言用到這個水平,才能算是登堂入室。

一般來說,我們會把指標跟陣列聯絡起來理解,比如*p就是乙個一維陣列,**p是兩維陣列等,而一般而言,見到兩維的指標也算是難得了,更高維的只怕看一會就會暈掉。《unix系統程式設計》中有個關於引數列表的例子,感覺對指標運用的已經到出神入化的境地,所以貼出來大家參考一下。

在c語言的入口main函式中,有乙個**argv引數,指明命令列引數,一般寫法是這樣:

c**  

int main(int argc, char **argv)  

這個**argv,是乙個指向指標的指標,用來將命令列引數儲存下來,比如,輸入一條命令:

prog -c -v 200

**argv中的內容即為 prog, -c, -v, 200. 因為prog, -c等的長度不等,就需要乙個指標來引用他們,而prog後邊接幾個引數也是不定的,所以有需要有乙個指標來引用,所以就是這裡的二維指標了。畫乙個table可能看起來比較清晰一些:

prog

-c-v

200

再考慮這樣一種情況,shell程式,對於你會輸多少行命令也是不知道的,那它就需要再多乙個指標來引用你會有多少個命令輸入。這就是我們今天要看的(***ptr)了。

書中的例子是這樣,先看下函式的原型: 

c**  

int makeargv(const

char *s, const

char *delimiters, char ***argvp);  

函式接受三個引數,第乙個是要分析的串,第二個是界定符序列,第三個是生成的"指標的指標"(即二維陣列)的指標。實現比較簡單,主要是看其中關於指標的用法:

c**  

/** author : juntao.qiu

*/int makeargv(const

char *s, const

char *delimiters, char ***argvp)  

*argvp = null;  

snew = s + strspn(s, delimiters); 

//strspn() 計算字串 str 中連續有幾個字元都屬於字串 accept,其原型為:

//size_t strspn(const char *str, const char * accept);

if((t = malloc(strlen(snew)+1)) == null)  

return -1;  

strcpy(t, snew);  

numtokens = 0;  

if(strtok(t, delimiters) != null)  

for(numtokens = 1; strtok(null, delimiters)!= null; numtokens++);  

//strtok

分解字串為一組標記串。s為要分解的字串,delim為分隔符字串。

if((*argvp = malloc((numtokens+1)*sizeof(char *))) == null)  

if(numtokens == 0)else  

*((*argvp)+numtokens) = null;  

return numtokens;  

}  

程式的主體比較簡單,就是按照傳入的s,按照界定符delimiters對其進行分割,分割完成後將其放在乙個二維陣列中,第一維表示最後陣列,第二維表示第乙個陣列中每乙個元素的值。

好了,我們測試一下其運**況:

c**  

int main(int argc, char **argv)  

printf("argument contains :\n");  

for(i = 0;i 

printf("%d:%s\n", i, argvp[i]);  

return 0;  

}  

執行結果如下:

字串(一) 字串Hash

今天開一手最不 tao 擅 yan 長的字串演算法 字串hash演算法。似乎提到字串的話,kmp應該是更為常見的一種,但是hash有它的優點,被犇們稱為 優雅的暴力 何謂hash?hash的中文稱為雜湊,這當然是音譯,直譯過來就是雜湊,或者也有叫預對映的。雜湊的作用就是通過某個特殊函式的對映,將任意...

第一字串 Trie Topology

bessie最近在玩字串。她發現通過改變字母的順序可以使一些字串排在其他所有的字串之前 按字典序從小到大排序 比如說,bessie找到了對於字串 omm moo mom 和 ommnom 她可以用標準的字母表把 mom 排在最前面,也可以用字母表 abcdefghijklonmpqrstuvwxyz...

演算法題(一) 字串

public static string submax string strarr else if max k system.out.println max return arrays.copyofrange strarr,start,end 1 給定兩個字串str1,str2。如果兩者字元種類和相...