在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);如果我对变量'line‘使用char数组,它就能工作。例如,char line[] =“要分隔的行”有效。
请解释一下。
发布于 2010-05-16 17:52:31
strtok修改输入字符串line。
char *line = "LINE TO BE SEPARATED";在本例中,line指向只读内存。因此,不能修改。您需要为strtok传入字符数组。
发布于 2010-05-16 18:38:44
因为它有一个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;
}我不得不(不情愿地)承认这是有道理的。
发布于 2010-05-16 19:11:15
char *line是一个指针,您将它指向一个常量字符串("LINE TO BE SEPARATED")。当strtok尝试修改该字符串时,此操作将失败。最好限定这个变量,因为const char *line-still不起作用,但是当您试图将它传递给strtok时,可能会导致一个有用的警告。
同时,可以修改数组char line[] (它不是const),并且仅将其初始化为包含字符串。
https://stackoverflow.com/questions/2843236
复制相似问题