#include<stdio.h>
#include<string.h>
int main(){
char str[] = "This is a sample string";
char *pch;
char piece1[10] = " ";
char piece2[10] = " ";
printf("\n %s \n",str);
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);
}
}
printf("\n str: %s \n",str); //prints only "This" and not the original string
return 0;
}
我无法理解用NULL作为第一个参数调用的第二个strtok
。当使用str调用strtok
时,它会分割第一个单词。 strtok(NULL," ")
对NULL做什么?
当我打印机str时,它会打印第一个单词而不是它在标记之前包含的原始字符串。
答案 0 :(得分:2)
幕后的strtok
将\0
置于找到分隔符的位置。这就是为什么你在第一次调用NULL
之后的strtok
传递str
(它跟踪下一个起始位置状态)。
当你打印出\0
时,它仍然是指向要标记的原始字符串开头的指针,但第一个分隔符现在是printf
。 \0
仅打印{{1}}。
答案 1 :(得分:1)
strtok
更改输入字符串(这就是为什么不能使用const /只读字符串作为输入)。基本上,在每次休息时,它都会用\0
替换分隔符以终止它。
它还在全球范围内存储一些状态,这就是它知道下一个项目的起始位置。
如果您想知道每个单词的位置,您需要跟踪每个strtok
调用返回的每个指针。
答案 2 :(得分:0)
来自man strtok(),请看大胆的亮点。
strtok()函数用于隔离null-ter-中的顺序令牌 minated string,str。这些令牌在字符串中用at分隔 sep中至少有一个字符。 第一次是strtok() 叫,str应该指定;随后的电话,希望获得毛皮 - 来自同一个字符串的标记,应该传递一个空指针。 每次都必须提供分隔符字符串sep,并且可能会更改 在电话之间。
因此,它会更改字符串,并在调用之间保持变量。