【问题标题】:Use strtok in a for loop在 for 循环中使用 strtok
【发布时间】:2013-06-25 15:50:13
【问题描述】:

要遍历我使用的字符串 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 

感谢您的帮助!

【问题讨论】:

  • 你在这三个方面都是对的 :)
  • 查看相关问题,详细了解strtok() 的工作原理。特别是stackoverflow.com/questions/3889992/please-help-in-strtok?rq=1
  • *tok 测试不是标准 strtok 习语的一部分。看起来它想在空字段上提前停止,但它不会起作用,因为 strtok 会跳过空字段。
  • @WumpusQ.Wumbley 所以 *tok 没用,应该删除吗?谢谢
  • 它什么也没做。删除 && *tok 不会改变行为。如果要检测空字段,则不能使用strtok。

标签: c


【解决方案1】:

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

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

【讨论】:

  • “几乎所有我见过的版本”——否则不可能实现它。
【解决方案2】:

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

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

【讨论】:

  • 它的工作方式确实是将初始调用的第一个参数隐藏在一个私有变量中。
  • 实际上,我应该说将第一个标记的结尾/下一个标记的开头隐藏起来,并在每次调用时更新。
【解决方案3】:

如果您阅读 manpages 中的 strtok 它会说明

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

【讨论】:

    【解决方案4】:

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

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

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

    你的 3 个猜测是正确的。

    【讨论】:

    • 我不是反对者,但它只是复制了 OP 写的内容,除了“这是如何工作的?”,它没有回答。
    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多