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

4 回答 4

4

这是一个示例 strtok 实现:http ://bxr.su/o/lib/libc/string/strtok.c#strtok

正如您在代码中看到的那样,它在内部使用了一个静态字符指针(我见过的几乎每个版本都存储一个指针,或者作为全局变量或作为上述情况的静态变量)。此版本调用可重入strtok_r(并且该行的副作用if (s == NULL && (s = *last) == NULL) 是如果传递了NULL,则使用最后一个指针)

于 2013-06-27T23:58:02.097 回答
1

(2) tok = strtok(NULL, ";"); // 转到 str 中的下一个标记?这是如何运作的?

这正是它的strtok()工作原理。通过NULL作为第一个参数发送,您表示strtok()应该继续使用上次调用期间发送给它的字符串。如果您想知道确切的实现细节,您需要查看strtok(). 它很可能使用静态局部变量。

于 2013-06-27T23:54:15.323 回答
-1

如果您阅读它manpagesstrtok状态

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

于 2013-06-27T23:53:41.270 回答
-1

您可以在此处找到有关strtok的更多信息。它有一些如何使用它的例子。

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

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

你的3个猜测是正确的。

于 2013-06-27T23:55:26.693 回答