C ++标记化的std串[重复](c++ tokenize std string [duplicat

2019-09-23 02:47发布

可能重复:
如何记号化在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*)’

我在寻找一个快速简便的方法来这是我不认为这需要很多时间

Answer 1:

我总是用getline此类任务。

istringstream is(line);
string part;
while (getline(is, part, ','))
  cout << part << endl;


Answer 2:

std::string::size_type pos = line.find_first_of(',');
std::string token = line.substr(0, pos);

寻找下一个标记,重复find_first_of但在启动pos + 1



Answer 3:

你可以使用strtok&*line.begin()来获得一个非const指针char缓冲区。 我通常喜欢使用boost::algorithm::split用C ++虽然。



Answer 4:

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(','));


文章来源: c++ tokenize std string [duplicate]