strtok程序崩溃

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

#include  ... 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 SEPARATED”有效。

请解释一下。

strtok修改输入字符串line

 char *line = "LINE TO BE SEPARATED"; 

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

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

 // Beware, brain-compiled code ahead! #include  #include  #include  int main() { std::istringstream iss("LINE TO BE SEPARATED"); while( iss.good() ) { std::string token; iss >> token; std::cout << token '\n'; } return 0; } 

编辑:正如Konrad在他的评论中所说,上面的循环可以被std::copy替换为流迭代器:

 // Beware, brain-compiled code ahead! #include  #include  #include  #include  int main() { std::istringstream iss("LINE TO BE SEPARATED"); std::copy( std::istream_iterator(std::iss) , std::istream_iterator() , std::ostream_iterator(std::cout, "\n") ); return 0; } 

我必须(勉强)承认有一些事情可以说。

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

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

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