使用 C 语言中的 strtok 解析数据

strtok 函数是一种方便的方法,可以从字符串中读取和解释数据。 在您的下一个项目中使用它来简化程序读取数据的方式。
3 位读者喜欢这篇文章。
Woman sitting in front of her laptop

kris krüg

有些程序可以一次处理整个文件,而其他程序则需要逐行检查文件。 在后一种情况下,您可能需要解析每一行中的数据。 幸运的是,C 编程语言有一个标准的 C 库函数可以做到这一点。

strtok 函数根据分隔每个字段的“分隔符”来分解一行数据。 它提供了一种简化的方式来解析来自输入字符串的数据。

读取第一个标记

假设您的程序需要读取一个数据文件,其中每一行都用分号分隔成不同的字段。 例如,数据文件中的一行可能如下所示

102*103;K1.2;K0.5

在这个例子中,将它存储在一个字符串变量中。您可能已经使用许多方法将此字符串读入内存。 这是代码行

char string[] = "102*103;K1.2;K0.5";

一旦您在字符串中有了该行,您可以使用 strtok 来提取“标记”。 每个标记都是字符串的一部分,直到下一个分隔符。 调用 strtok 的基本方式如下所示

#include <string.h>
char *strtok(char *string, const char *delim);

strtok 的第一次调用读取字符串,在第一个分隔符处添加一个空 (\0) 字符,然后返回指向第一个标记的指针。 如果字符串已经为空,则 strtok 返回 NULL。

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

int
main()
{
  char string[] = "102*103;K1.2;K0.5";
  char *token;

  token = strtok(string, ";");

  if (token == NULL) {
    puts("empty string!");
    return 1;
  }

  puts(token);

  return 0;
}

这个示例程序提取字符串中的第一个标记,打印它,然后退出。 如果您编译并运行此程序,您应该会看到此输出

102*103

102*103 是输入字符串的第一部分,直到第一个分号。 这是字符串中的第一个标记。

请注意,调用 strtok 会修改您正在检查的字符串。 如果您希望保留原始字符串,请在使用 strtok 之前创建一个副本。

将字符串的其余部分读取为标记

将字符串的其余部分分成标记需要多次调用 strtok,直到读取所有标记。 在使用 strtok 解析第一个标记后,对 strtok 的任何进一步调用都必须使用 NULL 代替字符串变量。 NULL 允许 strtok 使用内部指针指向字符串中的下一个位置。

修改示例程序以将字符串的其余部分读取为标记。 使用 while 循环多次调用 strtok,直到您获得 NULL。

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

int
main()
{
  char string[] = "102*103;K1.2;K0.5";
  char *token;

  token = strtok(string, ";");

  if (token == NULL) {
    puts("empty string!");
    return 1;
  }

  while (token) {
    /* print the token */
    puts(token);

    /* parse the same string again */
    token = strtok(NULL, ";");
  }

  return 0;
}

通过添加 while 循环,您可以一次解析字符串的其余部分,一次一个标记。 如果您编译并运行此示例程序,您应该会看到每个标记打印在单独的一行上,如下所示

102*103
K1.2
K0.5

输入字符串中的多个分隔符

使用 strtok 提供了一种快速简便的方法来将字符串分解为您正在寻找的部分。 您可以使用 strtok 解析各种数据,从纯文本文件到复杂数据。 但是,请注意,彼此相邻的多个分隔符与一个分隔符相同。

例如,如果您正在读取 CSV 数据(逗号分隔值,例如来自电子表格的数据),您可能会期望四个数字的列表如下所示

1,2,3,4

但是,如果数据中的第三个“列”为空,则 CSV 可能如下所示

1,2,,4

这是您需要小心使用 strtok 的地方。 使用 strtok,彼此相邻的多个分隔符与单个分隔符相同。 您可以通过修改示例程序以使用逗号分隔符调用 strtok 来看到这一点

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

int
main()
{
  char string[] = "1,2,,4";
  char *token;

  token = strtok(string, ",");

  if (token == NULL) {
    puts("empty string!");
    return 1;
  }

  while (token) {
    puts(token);
    token = strtok(NULL, ",");
  }

  return 0;
}

如果您编译并运行这个新程序,您会看到 strtok,, 解释为单个逗号,并将数据解析为三个数字

1
2
4

了解 strtok 中的这个限制可以节省您数小时的调试时间。

在 strtok 中使用多个分隔符

您可能想知道为什么 strtok 函数使用字符串作为分隔符而不是单个字符。 这是因为 strtok 可以在字符串中查找不同的分隔符。 例如,一行文本中可能在每个单词之间有空格和制表符。 在这种情况下,您将使用每个“空白”字符作为分隔符

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

int
main()
{
  char string[] = "  hello \t world";
  char *token;

  token = strtok(string, " \t");

  if (token == NULL) {
    puts("empty string");
    return 1;
  }

  while (token) {
    puts(token);
    token = strtok(NULL, " \t");
  }

  return 0;
}

每次调用 strtok 都使用空格和制表符作为分隔符字符串,从而允许 strtok 正确地将行解析为两个标记。

总结

strtok 函数是一种方便的方法,可以从字符串中读取和解释数据。 在您的下一个项目中使用它来简化程序读取数据的方式。

标签
photo of Jim Hall
Jim Hall 是一位开源软件倡导者和开发人员,以 GNOME 中的可用性测试以及 FreeDOS 的创始人兼项目协调员而闻名。

评论已关闭。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.