可能重复:
如何记号化在C ++字符串?
你好,我想知道我怎么会令牌化一个std字符串的strtok
string line = "hello, world, bye";
char * pch = strtok(line.c_str(),",");
我得到以下错误
error: invalid conversion from ‘const char*’ to ‘char*’
error: initializing argument 1 of ‘char* strtok(char*, const char*)’
我在寻找一个快速简便的方法来这是我不认为这需要很多时间
我总是用getline
此类任务。
istringstream is(line);
string part;
while (getline(is, part, ','))
cout << part << endl;
std::string::size_type pos = line.find_first_of(',');
std::string token = line.substr(0, pos);
寻找下一个标记,重复find_first_of
但在启动pos + 1
。
你可以使用strtok
做&*line.begin()
来获得一个非const指针char
缓冲区。 我通常喜欢使用boost::algorithm::split
用C ++虽然。
strtok
是一个相当奇特的,邪恶的函数,修改其参数。 这意味着你不能直接使用它在内容std::string
,因为没有办法让一个指针从该类一个可变的,零结尾的字符数组。
你可以在弦上的数据的拷贝工作:
std::vector<char> buffer(line.c_str(), line.c_str()+line.size()+1);
char * pch = strtok(&buffer[0], ",");
或者,更多的是C ++的成语,你可以使用一个字符串流:
std::stringstream ss(line);
std::string token;
std::readline(ss, token, ',');
或者更直接地找到逗号:
std::string token(line, 0, line.find(','));