2013-09-26 60 views
1
pch = strtok(str," "); 
strcpy(piece1,pch); 
printf("\n piece1 : %s \n",piece1); 
while(pch != NULL){ 
     printf("\n %s \n",pch); 
     pch = strtok(NULL," "); 
     if(pch != NULL){ 
       strcpy(piece2,pch); 
       printf("\n piece2 : %s \n",piece2); 
     } 
} 

strtok(str, " ")填充字符串中的空格'\0'strtok(NULL, " ")做什麼?在獲得第一個令牌後,它如何分割剩餘的字符串。在C編程中的strtok函數

+5

根據'man strtok':* strtok()函數將字符串解析爲一系列令牌。在第一次調用strtok()時,應該在str中指定要解析的 字符串。 **在每個應解析相同的 字符串的後續調用中,str應該爲NULL。*** – lurker

+0

此問題似乎是無關緊要的,因爲它是關於提供OP文檔的。 – 2013-09-26 16:53:02

+1

[strtok.c](http://www.opensource.apple.com/source/Libc/Libc-166/string.subproj/strtok.c) –

回答

3

strtok做了一些可能被認爲危險的事情。也就是說,當你調用它並且第一個參數不是NULL時,它將這個參數和一些其他信息保存在靜態變量中(使它完全線程UN安全)。

只要您保持傳遞null值,它就會使用您最初傳遞給它的相同char數組來尋找更多的標記。

實際上,更可能的實現是它將它在字符串中的位置保存在靜態變量中。它不應該關心你的字符串在哪裏開始;它只關心它在你的字符串中的位置。

此外,請記住strtok正在改變你傳遞它的實際字符串,所以如果你需要這個字符串沒有一堆'\ 0',你應該在調用strtok之前做了一個副本。