首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++中字符串的标记化

C++中字符串的标记化
EN

Stack Overflow用户
提问于 2008-11-05 19:46:48
回答 8查看 149K关注 0票数 25

我一直在尝试使用空格作为分隔符来标记一个字符串,但它不起作用。有没有人对为什么它不起作用有什么建议?

编辑:标记化使用:

代码语言:javascript
运行
复制
strtok(string, " ");

代码如下所示

代码语言:javascript
运行
复制
pch = strtok (str," ");
while (pch != NULL)
{
  printf ("%s\n",pch);
  pch = strtok (NULL, " ");
}
EN

回答 8

Stack Overflow用户

发布于 2008-11-05 19:57:39

如下所示:

代码语言:javascript
运行
复制
char s[256];
strcpy(s, "one two three");
char* token = strtok(s, " ");
while (token) {
    printf("token: %s\n", token);
    token = strtok(NULL, " ");
}

注意:strtok修改了字符串的标记化,所以它不能是const char*

票数 46
EN

Stack Overflow用户

发布于 2008-11-05 19:57:54

以下是strtok用法的一个示例,请记住,strtok对其输入字符串是破坏性的(因此不能用于字符串常量

代码语言:javascript
运行
复制
char *p = strtok(str, " ");
while(p != NULL) {
    printf("%s\n", p);
    p = strtok(NULL, " ");
}

基本上需要注意的是,将NULL作为第一个参数传递给strtok会告诉它从之前标记的字符串中获取下一个标记。

票数 39
EN

Stack Overflow用户

发布于 2008-11-05 20:14:22

strtok可能是非常危险的。它不是线程安全的。它的预期用途是在循环中一遍又一遍地调用,传递上一个调用的输出。strtok函数有一个存储strtok调用状态的内部变量。这种状态对于每个线程来说并不是唯一的-它是全局的。如果任何其他代码在另一个线程中使用strtok,您就会遇到问题。也不是你想要追踪的那种问题!

我建议使用regex实现,或者使用sscanf来拆分字符串。

试试这个:

代码语言:javascript
运行
复制
char strprint[256];
char text[256];
strcpy(text, "My string to test");
while ( sscanf( text, "%s %s", strprint, text) > 0 ) {
   printf("token: %s\n", strprint);
}

注意:“text”字符串在被分隔时会被销毁。这可能不是首选行为=)

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

https://stackoverflow.com/questions/266357

复制
相关文章

相似问题

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