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”工作。
请解释一下。
答案 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)