当前位置: C语言 -- 标准库 -- <string.h> -- strtok

strtok函数


概要:
#include <string.h>
char *strtok(char * restrict s1, 
      const char * restrict s2);

描述:

该函数拆分参数s1指向的字符串。连续调用该函数将参数s1指向的字符串拆分为一系列标记,每个标记使用参数s2指向字符串中的字符进行分隔。第一次调用该函数,第一个参数为非空指针;随后调用该函数,第一个参数为空指针。参数s2指向的分隔字符串每次调用可以不相同。

第一次调用strtok函数将搜索参数s1指向字符串中的第一个非分隔字符(即不是参数s2指向字符串中的字符。)。如果不存在这样的字符,函数返回一个空指针;如果存在这样的字符,该字符是第一个标记的开始字符,函数从这里开始搜索当前分隔字符。如果未搜索到当前分隔字符,当前标记将扩展至参数s1指向字符串的末尾,随后在相同字符串中搜索标记将返回空指针。如果搜索到当前分隔字符,该字符将被一个空字符覆盖,当前标记结束;函数保存一个指向紧跟该字符的字符的指针,搜索下一个标记将从那里开始。

随后每次调用strtok函数将用空指针作为第一个参数,从上次调用保存的位置开始重复上面的操作搜索下一个标记。


strtok函数不需要避免与其它strtok函数调用发生数据竞争。实现应像没有库函数调用strtok函数一样。

ISO/IEC 9899:2018标准定义了该函数的安全版本strtok_s


参数:
char * restrict s1

指向字符串的指针。

const char * restrict s2

指向分隔字符串的指针。


返回值:

如果不存在标记,函数返回空指针;否则函数返回指向标记首字符的指针。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
/*函数strtok范例*/

#include <stdio.h>
#include <string.h>

int main(void)
{
    char strOne[] = "You can fool all the people some of the time,\
                and some of the people all the time,\
                but you can not fool all the people all the time.";
    const char strTwo[] = ",.\' \"?!";
    char *ptr;
    int count = 0;

    /*统计句子中的单词数。*/
    ptr = strtok(strOne, strTwo);
    while(ptr!=NULL)
    {
        ++count;
        ptr = strtok(NULL, strTwo);
    }

    printf("Total %d word%s.\n", count, (count>1)?"s":"");
    
    return 0;
}


输出:

Total 29 words.


相关内容:
memchr 搜索指定字符在内存区域第一次出现位置的函数。
strchr 搜索指定字符在字符串中第一次出现位置的函数。
strcspn 计算最大初始片段长度的函数。
strpbrk 搜索字符在字符串中第一次出现位置的函数。
strrchr 搜索指定字符在字符串中最后一次出现位置的函数。
strspn 计算最大初始片段长度的函数。
strstr 搜索子字符串在字符串中第一次出现位置的函数。