有些程序可以一次处理整个文件,而其他程序则需要逐行检查文件。 在后一种情况下,您可能需要解析每一行中的数据。 幸运的是,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 函数是一种方便的方法,可以从字符串中读取和解释数据。 在您的下一个项目中使用它来简化程序读取数据的方式。
评论已关闭。