Я подозреваю, что ошибка действительно в предыдущей строке,
char * line2 = line.c_str();
Это потому, что c_str()
дает доступный только для чтения указатель на содержимое строки. Не существует стандартного способа получения модифицируемой строки в стиле C из строки C ++.
Самый простой вариант для чтения разделенных пробелами слов из строки (при условии, что это то, что вы пытаетесь сделать) - это использовать поток строк:
std::vector<std::string> words;
std::istringstream stream(line);
std::copy(std::istream_iterator<std::string>(stream),
std::istream_iterator<std::string>(),
back_inserter(words));
Если вы действительно хотите использовать strtok
, тогда вам понадобится доступная для записи копия строки с терминатором в стиле C; Один из способов сделать это - скопировать его в вектор:
std::vector<char> writable(line.c_str(), line.c_str() + line.length() + 1);
std::vector<char *> words;
while (char * word = strtok(words.empty() ? &writable[0] : NULL, " ")) {
words.push_back(word);
}
Имейте в виду, что strtok
довольно сложно правильно использовать; вам нужно вызывать его один раз для каждого токена, а не один раз, чтобы создать массив токенов, и убедиться, что ничто другое (например, другой поток) не вызывает его, пока вы не закончите со строкой. Я не уверен, что мой код полностью верен; Я давно не пытался использовать именно эту форму зла.