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/ 。