c - strtok() 如何在 C 中将字符串拆分为标记?

标签 c string split token strtok

请向我解释strtok() 函数的工作原理。手册说它将字符串分解为标记。我无法从手册中理解它的实际作用。

我在 str*pch 上添加了 watches 来检查它在第一个 while 循环发生时的工作情况,str 的内容只有 "这个”。下面显示的输出是如何打印在屏幕上的?

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

输出:

Splitting string "- This, a sample string." into tokens:
This
a
sample
string

最佳答案

strtok 运行时函数是这样工作的

第一次调用 strtok 时,您提供了一个要标记化的字符串

char s[] = "this is a string";

在上面的字符串中,空格似乎是单词之间的一个很好的分隔符,所以让我们使用它:

char* p = strtok(s, " ");

现在会搜索 's' 直到找到空格字符,返回第一个标记('this')并且 p 指向该标记(字符串)

为了获取下一个标记并继续使用相同的字符串 NULL 作为第一个传递 参数,因为 strtok 维护一个指向您之前传递的字符串的静态指针:

p = strtok(NULL," ");

p 现在指向 'is'

依此类推,直到找不到更多空格,然后返回最后一个字符串作为最后一个标记“string”。

更方便的是你可以这样写而不是打印出所有的标记:

for (char *p = strtok(s," "); p != NULL; p = strtok(NULL, " "))
{
  puts(p);
}

编辑:

如果你想存储从 strtok 返回的值,你需要将 token 复制到另一个缓冲区,例如strdup(p); 因为原始字符串(由 strtok 中的静态指针指向)在迭代之间被修改以返回 token 。

关于c - strtok() 如何在 C 中将字符串拆分为标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3889992/

相关文章:

c - 了解嵌套 for 循环的逻辑

c - 读取命令行参数

c - 编辑 makefile 以允许在 linux 中进行调试

java - 如何将字符串数组中的所有项目添加到 Java 中的 vector 中?

java - 使用带花括号的 split() 时出错 "{"

c - 用 C 打开 LDAP 客户端 - 如何替换已弃用的 API

Java 将字符串(日/月/年)格式转换为日期

delphi - 如何在 Delphi 中将一个 StringList 拆分为两个字符串列表?

c - 如何将链表拆分为2个列表?

java - 创建一种确定单词元音和声的方法