考虑以下使用strtok拆分字符串madddy的代码片段。
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将分隔符字符串中的每个字符都作为分隔符。但在某些情况下,它是这样做的,但在少数情况下,它会产生意想不到的结果。有人能帮我理解一下吗?
发布于 2011-01-14 11:02:47
您似乎忘记了在第一次调用strtok时(循环外)使用了分隔符"d“。
strtok工作得很好。您应该有一个引用here。
对于第二个示例(strtok("ay")):
首先,调用strtok(str,"d")。它将查找第一个"d",并分离您的字符串。具体地说,它设置tmp = "Ma“和str = "ddy”(去掉第一个"d")。
然后,调用strtok(str,"ay")。它将在str中查找"a“,但是由于您字符串现在只有"ddy",所以不会发生匹配。然后,它将查找"y“。所以str = "dd“和tmp = "”。
如您所见,它输出"Madd“。
发布于 2011-01-14 10:34:06
“试着理解strtok”祝你好运!
不管怎么说,我们是在2011年。正确标记:
std::string str("abc:def");
char split_char = ':';
std::istringstream split(str);
std::vector<std::string> token;
for (std::string each; std::getline(split, each, split_char); token.push_back(each));:D
发布于 2011-01-14 10:37:08
弗雷德·弗林斯通可能用了strtok()。它比多线程环境更早,并打乱(修改)源字符串。
当为第一个参数调用NULL时,它会继续解析最后一个字符串。这个特性很方便,但即使在当时也有点不寻常。
https://stackoverflow.com/questions/4687423
复制相似问题