首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试理解strtok

尝试理解strtok
EN

Stack Overflow用户
提问于 2011-01-14 10:26:19
回答 6查看 6.3K关注 0票数 4

考虑以下使用strtok拆分字符串madddy的代码片段。

代码语言:javascript
复制
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修改为以下内容,

代码语言:javascript
复制
tmp=strtok(NULL, "ay");

输出变为Madd。那么strtok到底是如何工作的呢?我有这个问题是因为我希望strtok将分隔符字符串中的每个字符都作为分隔符。但在某些情况下,它是这样做的,但在少数情况下,它会产生意想不到的结果。有人能帮我理解一下吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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“。

票数 1
EN

Stack Overflow用户

发布于 2011-01-14 10:34:06

“试着理解strtok”祝你好运!

不管怎么说,我们是在2011年。正确标记:

代码语言:javascript
复制
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

票数 10
EN

Stack Overflow用户

发布于 2011-01-14 10:37:08

弗雷德·弗林斯通可能用了strtok()。它比多线程环境更早,并打乱(修改)源字符串。

当为第一个参数调用NULL时,它会继续解析最后一个字符串。这个特性很方便,但即使在当时也有点不寻常。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4687423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档