strtok程序崩溃

时间:2010-05-16 09:48:46

标签: c strtok

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

#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);

如果我使用char数组作为变量'line',它就可以了。 即char line [] =“LINE TO BE STARATED”工作。

请解释一下。

4 个答案:

答案 0 :(得分:8)

strtok修改输入字符串line

char *line = "LINE TO BE SEPARATED";

在这种情况下,line指向只读内存。因此,无法修改。您需要为strtok传递char数组。

答案 1 :(得分:2)

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

// 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替换为流迭代器:

// 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 :(得分:2)

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

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

答案 3 :(得分:1)

aJ说需要什么。我的建议是避免那个丑陋的&amp;不安全的strtok。你正在使用C ++,所以继续使用std :: string。您还可以使用Boost http://www.boost.org/doc/libs/1_43_0/libs/libraries.htm#String&amp; http://www.boost.org/doc/libs/1_43_0/doc/html/string_algo.html。如果您想要一个新的字符串类,可以查看http://bstring.sourceforge.net/