Он не компилируется, потому что c_str()
возвращает const char*
, он должен быть постоянным указателем на немодифицируемый внутренний буфер string
. С другой стороны, strtok()
принимает char*
, потому что он изменяет свою входную строку.
Теперь у вас есть два варианта: получить пригодную для использования строку C из strtok()
или переписать все на C++.
Создайте новую модифицируемую строку C из вашей строки C++:
char* modifiableLine = strdup(line.c_str());
x = atoi((strtok(modifiableLine, "(,)"));
// Other processing
free(modifiableLine);
Вы можете сделать это, если вам нужно хранить большой объем кода C внутри функции/класса C++. Лучшее решение — использовать то, что предлагает стандартная библиотека C++ (также отбрасывая функцию atoi()
C, если C++ 11). Давайте сначала напишем вспомогательную функцию:
int readNextInt(istringstream& is, const string& delimiters) {
string token;
if (getline(is, token, delimiters))
return stoi(token);
return 0; // End of stream?
}
Используется следующим образом:
istringstream is(line)
x = readNextInt(is, "(),");
xx = readNextInt(is, "(),");
xxx = readNextInt(is, "(),");
Обратите внимание, что стандартная функция C++ getline()
не принимает параметр string
для разделителей, а принимает только один char
, только тогда вам нужно написать свою собственную перегруженную версию. Взгляните на этот пост для хорошей и приятной возможной реализации (вы также можете просто заменить getline()
на is >> token
после is.imbue()
, см. пример).
Ну... если вы уже используете Boost, вы можете просто использовать boost::tokenizer
.
person
Adriano Repetti
schedule
02.12.2014
'(,)'
неправильно. Должно быть"(,)"
. - person Captain Obvlious   schedule 02.12.2014c_str()
возвращаетconst char*
, предполагается, что это постоянный немодифицируемый указатель на строковый внутренний буфер.strotok()
изменяет входную строку для выполнения токенизации (поэтому он принимаетchar*
вместоconst char*
), то просто так делать нельзя. - person Adriano Repetti   schedule 02.12.2014