2013-07-05 71 views
3

對於由strtok返回的字符串,它有一個\0末? 還是不這樣做,就像strncpy函數?是包含在函數strtok的返回值中的空字符?

我會通過的strtok的返回值與strcpy複製到另一個字符串數組檢查,但當時我不知道,如果附加\0是的strtokstrcpy的影響(因爲strcpy確實增加了\0)。

編輯:對不起,我不能「將strtok的返回值複製到strcpy的另一個字符串數組」。

+5

請記得先查看文檔 - 特別是在相對容易找到的情況下(即函數名稱已知)。 – Paul

回答

10

cplusplus.com

令牌的這一端以空字符, 自動替換和令牌的開頭部分是由函數返回。

+0

我知道原始字符串中的標記結尾被替換爲空字符。但這與返回的內容不同。我想知道返回的值是否在最後有一個空字符?還是暗示返回的值在最後沒有空字符,因爲它是令牌的「開始」?我不清楚「開始」和「結束」是什麼意思。 「開始」是否包含替換後的空字符? – user81055

+0

@ user81055 strtok是老派的C.只有原始和可能修改的數據。 – Paul

+0

那麼這就是調試存在的原因。它**是**在字符串的末尾放置空字符。 –

5

從C99 7.24.5.8

的strtok的功能然後從那裏搜索該被包含在當前 分隔符字符串的一個字符。如果找不到這樣的字符,則當前的標記延伸到字符串的結束 s1指向和之後的令牌搜索將返回一個空指針 。如果找到這樣的字符,它是由一個空字符,其 終止當前令牌覆蓋。 strtok函數會保存一個指向下面的 字符的指針,從該字符開始下一個令牌搜索。

0

是有一個空終止符。它在最後找到的分隔符處。這就是strtok的第一個參數不是const char *的原因:它修改了你給它的緩衝區,這意味着它不能是const。

char buffer[0x20]; 
char *token; 

sprintf(buffer, "Hello, world!"); 
printf("Address of BUFFER before strtok: %p\n", (void *)buffer); 
token = strtok(buffer, ", !"); 
printf("Address of TOKEN after strtok: %p\n", (void *)token); 
printf("Value of BUFFER: %s\n", buffer); 
printf("Value of TOKEN: %s\n", token); 

運行這一點,你就會明白,通過了第一個字符串由strtok的修改的第一個字符首次發現一個空結束後更改任何分隔符,如果你用」你好,,, ,,意,世界!「,它會返回」Hello \ 0 ,, world!「。

第一次調用後函數strtok,你可以通過傳遞NULL作爲strtok時,第一個參數解析更多的令牌。它會自己找到下一個非分隔標記。你可以繼續這樣做,直到strtok返回NULL,在這種情況下,沒有更多的匹配。

-1

是的,它does.From cplusplus

爲了確定開始和令牌的端部,從起始位置的函數首先 掃描的第一個字符不是定界符包含 (成爲令牌的開始)。然後 掃描從這個開始令牌的開始包含在分隔符的第一個字符 ,成爲令牌結束。 如果找到終止空字符,掃描也會停止。

我不喜歡這樣,檢查的strtok是否追加'\0'與否:

#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    char str[]="here !is the! damn code"; 
    setbuf(stdout,NULL); 
    char s[]="!"; 
    char *token; 
    token=strtok(str,s);//first call: the function here expects str as argument and first scans from the starting location for the first character not contained in delimiters. 
    while(token!=NULL) 
    { 

     if(*token!='\0') 
     { 
     printf("the end of the token is replaced by a null character");// printed for each token which means that the delimiter was replaced by null character,and lastly at the end of the string. 
     printf("and the token is : %s\n",token);// tokens are printed 
     } 
     token=strtok(NULL,s);// the function expects a null pointer(NULL) and uses the position right after the end of last token as the new starting location for scanning in the subsequent calls. 
    }  
    return 0; 
} 

分隔符的數量放在劃分str令牌和令牌的末尾被替換空字符。因此,如果令牌不會以空字符結束,則每個令牌都會打印這些語句,這些語句只會打印一次,即在最後。

+0

「* ... //這裏的標記檢查它是否包含\ 0或不包含...... *」:您的評論有誤導性:'while(token!='\ 0')'檢查'token'是否相等' 0',會說什麼都指向什麼。這與OP提到的'strtok()'結果''\'0''結尾無關。順便說一句:它應該更好地閱讀:'while(token!= NULL)',因爲'token'是一個指針。 – alk

+0

@alk好的,謝謝澄清。但是'strtok'返回'token'並且必須包含'\ 0'。不是嗎? – 0decimal0

+0

正如**已經指出的這個問題的其他各種答案**:'strtok()'返回'NULL'或者返回傳遞給'strtok()'的初始調用的字符數組中某個元素的引用。這個inital字符串用''\ 0'修補,其中一個分隔字符(如第二個參數傳遞給初始調用strtok()')所發現的那樣。 – alk

0

是的,由strtok返回的每個標記最後都有'\0'。它不僅僅是「包含」它實際上被強制寫入到你的輸入字符串中。 strtok返回指向您的原始輸入字符串的指針,並通過將其寫入其中'\0'而破壞您在此過程中的輸入字符串。這是一個設計很差的功能,最好避免。

相關問題