對於由strtok
返回的字符串,它有一個\0
末? 還是不這樣做,就像strncpy
函數?是包含在函數strtok的返回值中的空字符?
我會通過的strtok
的返回值與strcpy
複製到另一個字符串數組檢查,但當時我不知道,如果附加\0
是的strtok
或strcpy
的影響(因爲strcpy
確實增加了\0
)。
編輯:對不起,我不能「將strtok
的返回值複製到strcpy
的另一個字符串數組」。
對於由strtok
返回的字符串,它有一個\0
末? 還是不這樣做,就像strncpy
函數?是包含在函數strtok的返回值中的空字符?
我會通過的strtok
的返回值與strcpy
複製到另一個字符串數組檢查,但當時我不知道,如果附加\0
是的strtok
或strcpy
的影響(因爲strcpy
確實增加了\0
)。
編輯:對不起,我不能「將strtok
的返回值複製到strcpy
的另一個字符串數組」。
令牌的這一端以空字符, 自動替換和令牌的開頭部分是由函數返回。
從C99 7.24.5.8
的strtok的功能然後從那裏搜索該被包含在當前 分隔符字符串的一個字符。如果找不到這樣的字符,則當前的標記延伸到字符串的結束 s1指向和之後的令牌搜索將返回一個空指針 。如果找到這樣的字符,它是由一個空字符,其 終止當前令牌覆蓋。 strtok函數會保存一個指向下面的 字符的指針,從該字符開始下一個令牌搜索。
是有一個空終止符。它在最後找到的分隔符處。這就是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,在這種情況下,沒有更多的匹配。
是的,它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或不包含...... *」:您的評論有誤導性:'while(token!='\ 0')'檢查'token'是否相等' 0',會說什麼都指向什麼。這與OP提到的'strtok()'結果''\'0''結尾無關。順便說一句:它應該更好地閱讀:'while(token!= NULL)',因爲'token'是一個指針。 – alk
@alk好的,謝謝澄清。但是'strtok'返回'token'並且必須包含'\ 0'。不是嗎? – 0decimal0
正如**已經指出的這個問題的其他各種答案**:'strtok()'返回'NULL'或者返回傳遞給'strtok()'的初始調用的字符數組中某個元素的引用。這個inital字符串用''\ 0'修補,其中一個分隔字符(如第二個參數傳遞給初始調用strtok()')所發現的那樣。 – alk
是的,由strtok
返回的每個標記最後都有'\0'
。它不僅僅是「包含」它實際上被強制寫入到你的輸入字符串中。 strtok
返回指向您的原始輸入字符串的指針,並通過將其寫入其中'\0'
而破壞您在此過程中的輸入字符串。這是一個設計很差的功能,最好避免。
請記得先查看文檔 - 特別是在相對容易找到的情況下(即函數名稱已知)。 – Paul