Re: [問題] 關於這個function

看板C_and_CPP作者 (喲)時間13年前 (2010/09/10 06:42), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《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)
文章代碼(AID): #1CYMB2b7 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1CYMB2b7 (C_and_CPP)