首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strtok程序崩溃

strtok程序崩溃
EN

Stack Overflow用户
提问于 2010-05-16 17:48:46
回答 4查看 4.3K关注 0票数 3

http://www.opengroup.org/onlinepubs/000095399/functions/strtok.html上给出的strtok程序每次都会崩溃。

代码语言:javascript
复制
#include <string.h>
...
char *token;
char *line = "LINE TO BE SEPARATED";
char *search = " ";


/* Token will point to "LINE". */
token = strtok(line, search);


/* Token will point to "TO". */
token = strtok(NULL, search);

如果我对变量'line‘使用char数组,它就能工作。例如,char line[] =“要分隔的行”有效。

请解释一下。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-16 17:52:31

strtok修改输入字符串line

代码语言:javascript
复制
char *line = "LINE TO BE SEPARATED";

在本例中,line指向只读内存。因此,不能修改。您需要为strtok传入字符数组。

票数 8
EN

Stack Overflow用户

发布于 2010-05-16 18:38:44

因为它有一个C++标签:

代码语言:javascript
复制
// Beware, brain-compiled code ahead!
#include <string>
#include <sstream>
#include <iostream>

int main()
{
  std::istringstream iss("LINE TO BE SEPARATED");
  while( iss.good() ) {
    std::string token;
    iss >> token;
    std::cout << token '\n';
  }

  return 0;
}

编辑:正如康拉德在他的评论中所说,上面的循环可以被在流迭代器上工作的std::copy所取代:

代码语言:javascript
复制
// Beware, brain-compiled code ahead!
#include <string>
#include <sstream>
#include <iostream>
#include <algorithm>

int main()
{
  std::istringstream iss("LINE TO BE SEPARATED");
  std::copy( std::istream_iterator<string>(std::iss)
           , std::istream_iterator<string>()
           , std::ostream_iterator<string>(std::cout, "\n") );
  return 0;
}

我不得不(不情愿地)承认这是有道理的。

票数 2
EN

Stack Overflow用户

发布于 2010-05-16 19:11:15

char *line是一个指针,您将它指向一个常量字符串("LINE TO BE SEPARATED")。当strtok尝试修改该字符串时,此操作将失败。最好限定这个变量,因为const char *line-still不起作用,但是当您试图将它传递给strtok时,可能会导致一个有用的警告。

同时,可以修改数组char line[] (它不是const),并且仅将其初始化为包含字符串。

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

https://stackoverflow.com/questions/2843236

复制
相关文章

相似问题

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