假设我正在使用这样的strtok() ..

char *token = strtok(input, ";-/");

有没有办法找出实际使用哪个令牌? 例如,如果输入类似于:

Hello there; How are you? / I'm good - End

我可以找出每个令牌使用哪个分隔符? 我需要能够输出特定的消息,具体取决于令牌后面的分隔符。

#1楼 票数:9 已采纳

重要提示: strtok不可重入,您应该使用strtok_r而不是它。

您可以通过保存原始字符串的副本,并查看当前令牌到该副本的偏移量来实现:

char str[] = "Hello there; How are you? / I'm good - End";
char *copy = strdup(str);
char *delim = ";-/";
char *res = strtok( str, delim );
while (res) {
    printf("%c\n", copy[res-str+strlen(res)]);
    res = strtok( NULL, delim );
}
free(copy);

这打印

;
/
-

演示#1

编辑: 处理多个分隔符

如果需要处理多个分隔符,确定当前分隔符序列的长度会变得稍微困难​​:现在需要在确定分隔符序列的长度之前找到下一个标记。 数学并不复杂,只要你记得NULL需要特殊处理:

char str[] = "(20*(5+(7*2)))+((2+8)*(3+6*9))";
char *copy = strdup(str);
char *delim = "*+()";
char *res = strtok( str, delim );
while (res) {
    int from = res-str+strlen(res);
    res = strtok( NULL, delim );
    int to = res != NULL ? res-str : strlen(copy);
    printf("%.*s\n", to-from, copy+from);
}
free(copy);

演示#2

#2楼 票数:3

你不能。 strtok用nul字符覆盖下一个分隔符(为了终止它此次返回的标记),它不存储它覆盖的先前值。 第一次在示例字符串上调用strtok时, ; 永远消失了。

如果你使用strtok保存一个未经修改的字符串副本,你可以做一些事情 - 给定当前令牌的nul终止符的索引(相对于字符串的开头),你可以查看相同的索引。复制,看看有什么。

当然,这可能比编写自己的代码以分离字符串更糟糕。 您可以使用strpbrkstrcspn ,如果您可以使用生成的令牌而不是为您终止nul。

#3楼 票数:1

男人3 strtok

在用NUL字符替换标记本身之后,strtok()和strtok_r()函数返回指向字符串中每个后续标记开头的指针。 当不再有令牌时,返回空指针。

但是通过一个小指针算术,您可以执行以下操作:

char* string = "Hello,World!";
char* dup = strdup(string);

char* world = strtok(string, ",");
char delim_used = dup[world - string];

free(dup);

  ask by Andrew Backes translate from so

未解决问题?本站智能推荐:

5回复

valgrind抱怨在c做一个非常简单的strtok

嗨,我正在尝试通过使用fread将整个文件加载到char[]来标记字符串。 由于一些奇怪的原因,它并不总是有效,而valgrind在这个非常小的示例程序中抱怨。 给出像test.txt这样的输入 以及以下方案 编译像 跑得像 谢谢
2回复

C中的嵌套strtok函数问题[重复]

这个问题在这里已经有了答案: 在 C 的嵌套循环中使用 strtok() 吗? (3 个回答) 4年前关闭。
3回复

使用strtok()在c中将字符串标记两次

我在c中使用strtok()来解析csv字符串。 首先我将它标记为只是找出有多少令牌,这样我就可以分配一个正确大小的字符串。 然后我使用上次用于标记化的相同变量。 每次我第二次这样做虽然它strtok(NULL, ",")返回NULL即使还有更多的标记要解析。 谁能告诉我我做错了什么?
2回复

在C的strtok()中包含'\\'

您好,我正在解析文本,并使用strtok()这样做。 我不确定如何在定界符中包含“ \\”,因为C在此字符后将看到任何代码。 谢谢!
1回复

用strtok()标记字符串会导致c崩溃

我试图创建一个函数,该函数用给定的分隔符标记给定的字符串,将标记放入2D char数组中并返回它。 代码下方显示: 当我尝试打印任何令牌时,我崩溃了。 只要有一个令牌,我就会增加令牌数组的大小,并为要复制的令牌分配指针。 有什么建议么? 谢谢!
4回复

Strtok删除了令牌C中的第一个字符

尝试从指向我的“自制”Http服务器的http请求中标记字符串时,我遇到了这个小问题。 基本上我正在使用这些代码行进行tokneize。 问题是对于每个令牌,第一个字符将从标记化字符串中删除。 我怎么解决这个问题? 我试过复制字符串,我尝试过使用strstr,但我还没有成功
1回复

我对fgets()和strtok()的使用是否因解析多行输入而不正确?

我正在编写一个Moore Voting算法的实现,用于在数组中查找多数元素 (即发生超过size/2次的元素)。 代码应返回多数元素(如果存在),否则应返回-1。 现在我的majorityElement(int size, int arr[])似乎完全正常,如果我直接硬编码main()函数中
1回复

strtok / strtok_r在中间退出解析

strtok_r将空字符放入输入字符串的不同位置。 仅在strtok_r返回NULL之后, strtok_r还原原始字符串。 如果我需要在长字符串开头附近的某个位置提取令牌怎么办? 如果我退出循环,则输入字符串将保持断开状态。 我可以尝试手动还原定界符,但是我不知道它是否是最后一个标