Возможный дубликат:
Разделение строки в C ++
Как прочитать кучу слов, разделенных пробелами, в массив?
Скажи, что у меня есть это предложение:
«Я люблю лягушек»
И этот массив:
string mySentenceArray[2]
Я хотел бы сделать
mySentenceArray[0] = I
mySentenceArray[1] = like
mySentenceArray[2] = frogs
Просто в качестве примера. (Пожалуйста, никто не говорит мне, чтобы жестко закодировать предложение, которое я только что написал, это пример.)
Вы можете превратить строку в серию токенов и поместить эти токены в массив. Учти это: http://www.cplusplus.com/reference/clibrary/cstring/strtok/
Есть несколько способов:
использование strtok. Но это C-функция, а не C ++. Смешивание C и C ++ — плохой стиль. более того strtok
функция не является поточно-ориентированной
Используйте любой из станд :: строка :: найти метод. Это сложно.
использование станд :: stringstream учебный класс. Это требует слишком много шагов.
использование повышение :: Алгоритм :: строка :: раскол. Я предпочитаю этот путь. Это просто и быстро.
Если бы у меня не было других способов оправдать добавление дополнительной библиотеки, я бы просто использовал stringstream
:
std::istringstream buffer("I like frogs");
std::vector<std::string> words((std::istream_iterator<std::string>(buffer)),
std::istream_iterator<std::string>());
std::copy(words.begin(), words.end(),
std::ostream_iterator<std::string>(std::cout, "\n"));
Используя только стандартную библиотеку:
istringstream sentence("I like frogs");
vector<string> words(
(istream_iterator<string>(sentence)),
(istream_iterator<string>()));
Обратите внимание, что ненужные, казалось бы, круглые скобки действительно необходимы по крайней мере для одного из аргументов конструктора, в противном случае вы будете раздражены самый неприятный разбор.
В качестве альтернативы, Boost предоставляет некоторые полезные строковые алгоритмы, в том числе split
:
string sentence("I like frogs");
vector<string> words;
boost::algorithm::split(words, sentence, boost::algorithm::is_space());