我听说很多程序员表示,将来可能会弃用使用strtok。有些人说目前仍然可用,为什么它不是一个好的选择呢? strtok()在对给定字符串进行标记化方面表现出色。这是否与时间和空间复杂度有关? 我在互联网上找到的最好链接是这个。但这似乎并不能解决我的好奇心。如果可能的话,请提供任何替代方法。
我听说很多程序员表示,将来可能会弃用使用strtok。有些人说目前仍然可用,为什么它不是一个好的选择呢? strtok()在对给定字符串进行标记化方面表现出色。这是否与时间和空间复杂度有关? 我在互联网上找到的最好链接是这个。但这似乎并不能解决我的好奇心。如果可能的话,请提供任何替代方法。
"
"中,否则我们希望对引号内的内容应用不同的分词规则,然后再按空格分隔规则处理。strtok与自身组合效果非常差,因此仅适用于最简单的分词任务。不可变的词法分析器技术比修改状态的词法分析器更易于理解。而且你可以通过将已弃用的词法分析器保存在列表中来调试它们,现在你可以一次性地检查所有令牌化操作的完整历史记录。
strtok("hello world", " ")
对于经验丰富的C程序员来说显然是错误的,但对于初学者来说似乎很好!尽管如此,这对于两者都是一个容易犯的错误。 - autisticstrtok
与适当的词法分析器相比的局限性,但我认为它并没有直接解释为什么应该将其弃用(除了简要提到“strtok与自身组合非常差”,而没有解释为什么组合不好)。此外,通常从标准库中弃用的东西都会被替换为其他东西(在strtok
的情况下可能是像strtok_r
或strtok_s
这样的东西)。 - jamesdlinstrtok(char *str, const char *delim)
的限制在于它无法同时处理多个字符串,因为它维护一个静态指针来存储已解析的索引(因此仅在一次操作一个字符串时使用足够)。更好、更安全的方法是使用 strtok_r(char *str, const char *delim, char **saveptr)
,它显式地使用第三个指针来保存已解析的索引。