跳到主要内容

C++ strtok() 字符串分割函数

C++ 中的 strtok() 函数返回 C 字符串(空终止字节字符串)中的下一个令牌。

“令牌”是字符串的较小部分,它们由指定的字符分隔开,这个字符被称为分隔符。

这个函数定义在 cstring 头文件中。

示例

#include <cstring>
#include <iostream>
using namespace std;

int main() {
char quote[] = "Remember me when you look at the moon!";

// 当遇到空格时分割字符串
char* word = strtok(quote, " ");

cout << word;

return 0;
}

// 输出:Remember

strtok() 语法

strtok() 的语法是:

strtok(char* str, const char* delim);

简单来说,

  • str - 我们想要获取令牌的字符串
  • delim - 分隔符,即分隔令牌的字符

strtok() 参数

  • str - 指向要分词的空终止字节字符串(C 字符串)的指针
  • delim - 指向包含分隔符的空终止字节字符串的指针

strtok() 返回值

strtok() 函数返回:

  • 如果存在下一个令牌,则返回指向该令牌的指针
  • 如果没有更多令牌,则返回 NULL

strtok() 原型

cstring 头文件中定义的 strtok() 函数的原型是:

char* strtok(char* str, const char* delim);

多次调用 strtok()

strtok() 可以多次调用,以从同一字符串中获取令牌。有两种情况:

情况 1:str 不是 NULL

  • 这是对该字符串的 strtok() 的第一次调用。
  • 函数查找不在 delim 中的第一个字符。
  • 如果找不到这样的字符,字符串不包含任何令牌。因此返回空指针
  • 如果找到了这样的字符,那么从那里开始,函数查找存在于 delim 中的字符。
  • 如果没有找到分隔符,str 只有一个令牌。
  • 如果找到了分隔符,它会被替换为 '\0',并且其后的字符指针被存储在静态位置以供后续调用。

最后,函数返回指向令牌开头的指针。

情况 2:str 是 NULL

  • 这次调用被视为对 strtok() 的后续调用,str 为 NULL。
  • 函数从上次调用结束的地方继续。

示例 1:C++ strtok()

#include <cstring>
#include <iostream>
using namespace std;

int main() {
char quote[] = "Remember me when you look at the moon!";

// 当遇到空格时分割字符串
// str = quote, delim = " "
char* word = strtok(quote, " ");

cout << "token1 = " << word << endl;

// 获取下一个令牌,即第二个空格之前的单词
// NULL 表示我们使用之前相同的指针,即 quote
word = strtok(NULL, " ");

cout << "token2 = " << word;

// 获取第三个令牌
word = strtok(NULL, " ");

cout << "token3 = " << word;

return 0;
}
```**输出**

```cpp
token1 = Remember
token2 = me
token3 = when

在这个程序中,

  • 我们使用空格 " " 作为分隔字符 delimquote C-字符串进行了分词。每当 strtok() 遇到空格 " " 时,就会将 quote 分割成多个标记(token)。

  • 我们第一次调用该函数时,需要传递 quote 字符串以指定它是源字符串参数 src

char* word = strtok(quote, " ");
  • strtok() 函数的后续所有调用都将 src 参数设为 NULL。这个参数指示编译器使用之前使用过的 C-字符串指针(即 quote)作为源 src
word = strtok(NULL, " ");

示例 2:打印字符串中的所有标记

#include <cstring>
#include <iostream>
using namespace std;

int main() {
char str[] = "Remember me when you look at the moon!";
char delim[] = " ";

cout << "标记为:" << endl;

// 根据 delim 对 str 进行分词
char *token = strtok(str, delim);

// 循环直到 strtok() 返回 NULL
while (token) {

// 打印标记
cout << token << endl;

// 获取后续标记
token = strtok(NULL, delim);
}

return 0;
}

输出

标记为:
Remember
me
when
you
look
at
the
moon!