在for循环中使用strtok

7
为了循环遍历字符串str,我使用了以下代码:
for (tok = strtok(str, ";"); tok && *tok; tok = strtok(NULL, ";"))  
{  
   //do stuff  
}

我希望能够理解这个循环的工作原理。在我看来:
(1) tok = strtok(str, ";"); //initialization of tok with the first token in str    
(2) tok = strtok(NULL, ";"); // go to the next token in str? how does this work? 
(3) tok && *tok;  //this stops the loop when tok =NULL or *tok=NULL 

我很感谢您的帮助!


4
你在这三个方面都是对的 :) - Sergey Kalinichenko
请查看“相关问题”以获取有关strtok()如何工作的更多详细信息。特别是https://dev59.com/dm865IYBdhLWcg3wSMkw?rq=1 - Barmar
1
*tok 测试不是标准的 strtok 习惯用法的一部分。它似乎想要在空字段上提前停止,但这不起作用,因为 strtok 跳过空字段。 - user2404501
@WumpusQ.Wumbley 所以 *tok 是无用的,应该将其删除?谢谢。 - loisir2022
它什么也没做。删除 && *tok 不会改变行为。如果你想检测空字段,就不能使用 strtok。 - user2404501
4个回答

4
这里有一个示例的strtok实现:http://bxr.su/o/lib/libc/string/strtok.c#strtok。在代码中,你可以看到它在内部使用了一个静态字符指针(我看过的每个版本都是这样存储指针的,无论是作为全局变量还是像上面那样作为静态变量)。此版本调用可重入的strtok_r函数(而行if (s == NULL && (s = *last) == NULL) 的副作用是在传递NULL时使用最后一个指针)。请注意保留HTML标记。

我见过的几乎每个版本都是这样,否则就无法实现它。 - Jim Balter

1
这正是strtok()的工作原理。通过将第一个参数设为NULL,您告诉strtok()应该继续处理上一次传递给它的字符串。如果您想了解确切的实现细节,您需要查看strtok()的源代码。最有可能使用静态局部变量。

1
它的工作方式确实是将初始调用的第一个参数储存到私有变量中。 - Jim Balter
实际上,我应该说它将第一个标记的结尾/下一个标记的开头存储起来,并在每次调用时更新。 - Jim Balter

-1

如果你阅读了 strtokmanpages,它会说明:

strtok() 函数将一个字符串解析成一系列标记。在第一次调用 strtok() 时,应该在 str 中指定要解析的字符串。在每个后续调用中,应该解析相同的字符串,str 应为 NULL。


-1

您可以在此处了解更多关于strtok的信息。它有一些使用示例。

引用自链接,strtok(str, delim)中的str参数:

请注意,此字符串的内容将被修改并分成较小的字符串(标记)。 或者,可以指定空指针,在这种情况下,函数将继续扫描先前成功调用函数的位置。

您的三次猜测是正确的。


我不是那个点踩的人,但它只是重复了原帖作者写的内容,除了“这是如何工作的?”这个问题,它并没有回答。 - Jim Balter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接