C++ токенизировать стандартную строку

Возможный дубликат:
Как я могу токенизировать строку в 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*)’

Я ищу быстрый и легкий подход к этому, поскольку я не думаю, что это требует много времени

4 ответа

Решение

Я всегда использую 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() чтобы получить неконстантный указатель на 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(','));
Другие вопросы по тегам