7

可能重复:
如何在 C++ 中标记字符串?

您好,我想知道如何使用 strtok 标记 std 字符串

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*)’

我正在寻找一种快速简便的方法,因为我认为这不需要太多时间

4

4 回答 4

16

我总是getline用于此类任务。

istringstream is(line);
string part;
while (getline(is, part, ','))
  cout << part << endl;
于 2012-09-27T17:54:52.987 回答
11
std::string::size_type pos = line.find_first_of(',');
std::string token = line.substr(0, pos);

要找到下一个标记,重复find_first_of但从 开始pos + 1

于 2012-09-27T17:52:44.417 回答
3

您可以strtok通过做&*line.begin()来获取指向char缓​​冲区的非常量指针。我通常更喜欢boost::algorithm::split在 C++ 中使用。

于 2012-09-27T17:54:12.327 回答
1

strtok是一个相当古怪、邪恶的函数,它修改了它的论点。这意味着您不能直接在 a 的内容上使用它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(','));
于 2012-09-27T17:54:28.270 回答