【发布时间】:2011-01-14 02:26:18
【问题描述】:
考虑以下使用 strtok 拆分字符串 madddy 的 sn-p。
char* str = (char*) malloc(sizeof("Madddy"));
strcpy(str,"Madddy");
char* tmp = strtok(str,"d");
std::cout<<tmp;
do
{
std::cout<<tmp;
tmp=strtok(NULL, "dddy");
}while(tmp!=NULL);
它工作正常,输出是 Ma。但是通过将 strtok 修改为以下,
tmp=strtok(NULL, "ay");
输出变成了 Madd。那么 strtok 究竟是如何工作的呢?我有这个问题是因为我希望 strtok 将分隔符字符串中的每个字符都作为分隔符。但在某些情况下,它会这样做,但在少数情况下,它会产生意想不到的结果。谁能帮我理解这个?
【问题讨论】:
-
老实说,我认为正确的做法是完全停止使用
strtok。这是一个难以使用、难以调试的函数,根本没有线程安全保证。您可能最好使用string::find和string::substr的某种组合来进行解析。 -
出于重要性和重点,我愿意重复这一点,尤其是因为您使用的是 C++ 而不是 C。此外,您可能需要查看 boost::tokenize。
-
您没有打印换行符或其他符号来分隔匹配的标记。 Madddy,带有分隔符 d 和 y(无需指定 d 三次),仅包含“Ma”标记和尾随分隔符。带有分隔符 a 和 y 的 Madddy 由标记“M”和“ddd”组成 - 不带空格打印它们,您会看到“Mddd”。你说你看过《疯狂》?我认为这是一个错字...?
-
@Tony:我认为 Karthick 是对的。这里的问题是 Karthick 没有在他的令牌之间使用分隔符,因此很难给出准确的答案。
-
已将标签更改为 C。与通常更喜欢其他标记化形式的纯 C++ 开发人员相比,查看 C 标签的人可能更能提供帮助。