使用strtok将字符串解析为单词

时间:2013-09-26 00:59:14

标签: c

#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时,它会打印第一个单词而不是它在标记之前包含的原始字符串。

3 个答案:

答案 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,并且可能会更改      在电话之间。

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