循环使用的字符串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
感谢您的帮助!
答案 0 :(得分:4)
以下是strtok实施示例:http://bxr.su/o/lib/libc/string/strtok.c#strtok
正如您在代码中看到的那样,它在内部使用了一个静态字符指针(几乎我见过的每个版本都存储了一个指针,无论是作为全局变量还是静态变量,如上例所示)。此版本调用可重入strtok_r
(如果传递NULL,则行if (s == NULL && (s = *last) == NULL)
的副作用是使用最后一个指针)
答案 1 :(得分:1)
(2)tok = strtok(NULL,“;”); //转到str中的下一个标记?这是怎么回事?
这正是strtok()
的工作原理。通过发送NULL
作为第一个参数,您发信号通知strtok()
应该继续使用在上次调用期间发送给它的字符串。如果您想知道确切的实现细节,则需要查看strtok()
的源代码。很可能它使用静态局部变量。
答案 2 :(得分:-1)
如果您阅读manpages
strtok
,则说明
strtok()函数将字符串解析为一系列标记。上 第一次调用strtok()时应该指定要解析的字符串 在str。在每个应该解析相同字符串的后续调用中, str应为NULL。
答案 3 :(得分:-1)
您可以在此处找到有关strtok的更多信息。它有一些如何使用它的例子。
从链接引用str
中的strtok(str, delim)
参数:
请注意,此字符串的内容已被修改并分解为较小的字符串(标记)。 或者,可以指定空指针,在这种情况下,函数继续扫描先前成功调用函数的位置。
你的3个猜测是正确的。