C strtok() 函数

C strtok() 语法

strtok() 是 C 语言 <string.h> 标准库的一个函数,它用于将字符串根据某个分割符来分割成一个个子串。

语法:

strtok(str, delim)

说明:

strtok() 函数接收以下 2 个参数。

  • str(char*):是一个字符串的指针。
  • delim(const char*):分割符,它是一个字符串的指针。

strtok() 函数会将字符串中指定分割符替换为 '\0',然后返回分割后的第一个子串。strtok() 的工作方式是通过一系列的调用,来逐步获取字符串中的标记。

  • 第一次调用:传入要分解的字符串作为 str 的参数。strtok() 会查找第 1 个非分隔符字符,将其视为标记的开始。然后,它会从该位置开始查找第 1 个分隔符。如果找到分隔符,它会用 '\0' 替换该分隔符,并返回指向标记开始位置的指针。strtok() 内部会保存下一个标记的起始位置。
  • 后续调用:传入 NULL 作为 str 参数。strtok() 会从上次保存的位置,开始继续查找下一个标记。它会跳过任何连续的分隔符,然后查找下一个非分隔符字符作为新标记的开始,并继续查找下一个分隔符,用 '\0' 替换并返回标记指针。

如果找到下一个标记,strtok() 会返回一个指向该标记的指针。如果没有找到更多的标记,则 strtok() 返回 NULL。

提示:

  • strtok 是 “string tokenize(字符串分词)” 的缩写。strtok() 函数将字符串分割成一个个子串,这些子串也被叫做 “令牌(token)”。
  • 如果想要线程安全,我们应该使用 strtok_r() 函数。

C strtok() 摘要

使用频率
修改字符串
官方文档 查看

C strtok() 示例

接下来,我们通过几个简单的例子来讲解一下 C strtok() 函数是如何使用的。

示例 1:strtok() 使用单个分割符

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

int main(void)
{
    char str[] = "Python,C++,Java";
    const char* delim = ",";

    // 获取第一个子串
    char* token = strtok(str, delim);

    // 继续获取其他的子串
    while (token != NULL) {
        printf("%s\n", token);
        // 传递 NULL 来获取下一个子串
        token = strtok(NULL, delim);
    }

    return 0;
}

运行结果如下。

Python
C++
Java

分析:

在使用 strtok() 函数,小伙伴们要注意以下 3 点。

  • strtok() 函数是 “破坏性” 的,它会修改原字符串。小伙伴们可以自行打印一下修改前后的字符串看看。如果想要保留原字符串,我们应该先使用 strncpy() 创建一个副本,然后对副本使用 strtok()。
  • strtok() 函数会保存分割后子串的起始位置(即指针),以便下次调用时继续分割。
  • 在第一次调用 strtok() 函数时,需要将第一个参数设置为要分割的字符串;在后续调用时,需要将第一个参数设置为 NULL。(小伙伴们将其视为固定写法即可)。

示例 2:strtok() 的分割符可以是多个

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

int main(void)
{
    char str[] = "red,orange*yellow-green$blue";
    const char* delim = ",*-$";

    // 获取第一个子串
    char* token = strtok(str, delim);

    // 继续获取其他的子串
    while (token != NULL) {
        printf("%s\n", token);
        // 传递 NULL 来获取下一个子串
        token = strtok(NULL, delim);
    }

    return 0;
}

运行结果如下。

red
orange
yellow
green
blue

分析:

strtok() 的分割符可以是多个,const char* delim = ",*-$"; 表示分割符可以是 ,*-$ 中的任意一个字符。

示例 3:strtok() 处理字符串开头的分隔符和连续的分隔符

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

int main(void)
{
    char str[] = ",,red,,green,,,blue";
    const char delim[] = ",";
    char* token;

    // 获取第一个子串
    token = strtok(str, delim);

    // 继续获取其他的子串
    while (token != NULL) {
        printf("%s\n", token);
        // 传递 NULL 来获取下一个子串
        token = strtok(NULL, delim);
    }

    return 0;
}

运行结果如下。

red
green
blue

分析:

strtok() 会跳过字符串开头的分隔符以及标记之间的连续分隔符。只有非分隔符字符之间的内容,才会被提取为标记。

示例 4:strtok() 解析简单的数据行

#include <stdio.h>
#include <string.h>
#include <stdlib.h>     // 包含 atoi() 函数

int main(void)
{
    char data[] = "阿莫,24,广州";
    const char delim[] = ",";
    char *token;

    // 提取姓名
    token = strtok(data, delim);
    printf("姓名: %s\n", token);

    // 提取年龄
    token = strtok(NULL, delim);
    if (token != NULL) {
        int age = atoi(token);       // 将年龄字符串转换为整数
        printf("年龄: %d\n", age);
    }

    // 提取城市
    token = strtok(NULL, delim);
    if (token != NULL) {
        printf("城市: %s\n", token);
    }

    return 0;
}

运行结果如下。

姓名 : 阿莫
年龄 : 24
城市 : 广州

分析:

在这个例子中,我们指定英文逗号(,) 作为 strtok() 的分割符,然后就可以依次提取姓名、年龄和城市等信息。这里还使用了 atoi() 函数将年龄的字符串表示转换为整数。

上一篇: strncpy()

下一篇: strchr()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号