0
#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;
}

我无法理解strtok以 NULL 作为第一个参数调用的第二个。当strtok使用 str 调用时,它会拆分第一个单词。strtok(NULL," "), 在NULL上做什么?

当我打印 str 时,它会打印第一个单词,而不是它在标记化之前包含的原始字符串。

4

3 回答 3

2

在找到分隔符的任何地方都放置了strtok幕后操作。\0这就是为什么你在NULL第一次调用之后传入后续时间strtok(它跟踪它的下一个起始位置状态)。

当您打印出来时,str它仍然是指向要标记的原始字符串开头的指针,但第一个分隔符现在是\0. printf最多只能打印一个\0.

于 2013-09-26T01:06:41.080 回答
1

strtok更改输入字符串(这就是为什么您不能使用 const/只读字符串作为输入的原因)。基本上,在每次中断时,它都会将分隔符替换\0为终止它。

它还全局存储一些状态,这就是它知道下一个项目从哪里开始的方式。

如果您想知道每个单词在哪里,您需要跟踪每次strtok调用返回的每个指针。

于 2013-09-26T01:05:46.687 回答
0

从 man strtok() 中,看到粗体突出显示。

strtok() 函数用于隔离以空字符结尾的字符串 str 中的顺序标记。这些标记在字符串中由 sep 中的至少一个字符分隔。 第一次调用 strtok() 时,应指定 str;随后的调用,希望从同一字符串中获取更多标记,应该传递一个空指针。 每次都必须提供分隔符字符串 sep,并且可以在调用之间更改。

因此,它会更改字符串并在调用之间保留一个变量。

于 2013-09-26T01:05:48.017 回答