C – 确定使用哪个分隔符 – strtok()

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

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

有没有办法找出实际使用哪个令牌? 例如,如果输入是这样的:

 你好; 你好吗?  /我很好 - 结束 

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

重要提示: 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

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

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

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

男人3 strtok

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

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

 char* string = "Hello,World!"; char* dup = strdup(string); char* world = strtok(string, ","); char delim_used = dup[world - string]; free(dup);