Re: [問題] 關於這個function
※ 引述《qazedctgb200 (暱稱)》之銘言:
: 各位好,
: 剛學C,目前正在做字串從後面印出
: EX. how,are,you 印出來變成 you are how
: 我是想到用堆疊去寫!!
: 我在網路上看到這個副程式
: void showStrRev(char *str)
: {
: char *p;
: if (p = strtok(str,","))
: {
: showStrRev(NULL);
: printf("%s ", p);
: }
: }
: 只要把字串丟進去,他就會有我要的結果,
: 請問這個副程式,可以幫我解釋一下,為什麼可以顛倒印出嗎
: strtok我只知道是把字串依照","分開
: 謝謝!!
strtok是會參考到一個外部狀態的函數,如果你給一個字串和分割符號,
它會幫你取第一個分割出來的項目,而其他部份會留在外部狀態中.
例如,
str = "hello,world" 外部狀態 = ""
執行strtok(str, ",") 之後,
取得項目 = "hello" 外部狀態 = "world"
之後只要再使用 strtok(NULL, ",") ,參數的字串給null,就會從外部狀態
分割資料出來. 最後,外部狀態沒東西時,就會傳回null.
例如,
外部狀態 = "world"
執行strtok(null,",")之後,
取得項目 = "world" 外部狀態 = ""
再執行strtok(null,",")之後,
取得項目 = NULL 外部狀態 = ""
所以,你可以想它是個遞迴過程,除了開始字串分割程序時是用一個明確的字串之外,
遞迴參考都是用 null 與相同的分割字串做參數. 而遞迴的底,也就是結束條件是
外部狀態沒有資料,這可以由 strtok(NULL,",") 的傳回值是否為 null 來判斷.
回頭看小程式 showStrRev, 可以看做是:
void showStrRev(char *str)
{
char *p;
p = strtok(str,",");
if (p == NULL) {
return;
} else
{
showStrRev(NULL);
printf("%s ", p);
}
}
遞迴呼叫是用 NULL 做參數,然後印出先前分割出來的項目. 先分割出來的項目,
是在遞迴呼叫之後印出,意思是,對這個項目 p 來說,後續的文字用遞迴呼叫先印出,
然後才把這個項目印出. 每個項目都這樣,這樣就有反向排列的效果. 而遞迴的底,
當分割的 p 為 NULL 時,什麼都不做.
這還蠻簡單的,是遞迴程式的基本題.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.160.114.23
※ 編輯: yauhh 來自: 218.160.114.23 (09/10 06:54)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):