在 C 语言中,我们可以使用 strtok() 函数根据某个分割符来将字符串分割成多个子串。
语法:
strtok(str, delim)说明:
strtok() 函数接收以下 2 个参数。
str(char*):是一个指向字符串的指针。delim(const char*):分割符,它是一个字符串,其中的每个字符都会被视为分隔符。
strtok() 函数会修改原始字符串,将字符串中指定的分割符替换为 '\0',然后返回分割后的第一个子串的指针。
提示:
- strtok 是 “string token(字符串令牌)” 的缩写。strtok() 函数将字符串分割成一个个子串,这些子串也被叫做 “令牌”。
- strtok() 函数是具有破坏性的,它会修改原始字符串。如果需要保留原始字符串,请先复制一份再进行分割。
示例 1:使用 strtok() 分割字符串
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "Python,C++,Java";
// 创建原始字符串的副本
char str_copy[sizeof(str)];
// 复制字符串
strcpy(str_copy, str);
// 定义分割符
const char* delim = ",";
// 获取第一个子串
char* token = strtok(str_copy, delim);
// 继续获取其他的子串
while (token != NULL)
{
printf("%s\n", token);
// 传递 NULL 来获取下一个子串
token = strtok(NULL, delim);
}
return 0;
}运行结果如下。
Python
C++
Java分析:
在使用 strtok() 函数,我们要注意以下 3 点。
- strtok() 函数是具有破坏性的,它会修改原字符串。在上面例子中,str_copy 数组在分割后会变成 "Python\0C++\0Java"。为了避免修改原始字符串,我们可以使用 strcpy() 函数创建一个副本 str_copy,然后再对其进行操作。
- strtok() 函数会保存分割后子串的起始位置(即指针),以便下次调用时继续分割。
- 在第一次调用 strtok() 函数时,需要将第一个参数设置为要分割的字符串;在后续调用时,需要将第一个参数设置为 NULL。(小伙伴们将其视为固定写法即可)
示例 2:strtok() 的分割符可以是多个
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "red,orange*yellow-green$blue";
// 创建原始字符串的副本
char str_copy[sizeof(str)];
// 复制字符串
strcpy(str_copy, str);
// 定义分割符
const char* delim = ",*-$";
// 获取第一个子串
char* token = strtok(str_copy, delim);
// 继续获取其他的子串
while (token != NULL)
{
printf("%s\n", token);
// 传递 NULL 来获取下一个子串
token = strtok(NULL, delim);
}
return 0;
}运行结果如下。
red
orange
yellow
green
blue分析:
strtok() 的分割符可以是多个,const char* delim = ",*-$"; 表示分割符可以是 “,*-$” 中的任意一个字符。
