Подтвердить что ты не робот

Использовать getline и while цикл для разделения строки

например, у меня есть строка:

string s = "apple | orange | kiwi";

и я искал, и есть способ:

stringstream stream(s);
string tok;
getline(stream, tok, '|');

но он может только вернуть первый токен "яблоко" Интересно, есть ли способ, чтобы он мог возвратить массив строк? Спасибо. Предположим, что строка s может быть изменена. Например, строка s = "apple | orange | kiwi | berry";

4b9b3361

Ответ 1

Как указывает Бенджамин, вы сами ответили на этот вопрос в своем названии.

#include <sstream>
#include <vector>
#include <string>

int main() {
   // inputs
   std::string str("abc:def");
   char split_char = ':';

   // work
   std::istringstream split(str);
   std::vector<std::string> tokens;
   for (std::string each; std::getline(split, each, split_char); tokens.push_back(each));

   // now use `tokens`
}

Обратите внимание, что ваши лексеты будут по-прежнему иметь символы верхнего/верхнего <space>. Вы можете отключить их.

Ответ 2

Так как между каждым словом есть пробел и |, вы можете сделать это:

string s = "apple | orange | kiwi";
stringstream ss(s);
string toks[3];
string sep;
ss >> toks[0] >> sep >> toks[1] >> sep >> toks[2];

cout << toks[0] <<", "<< toks[1] <<", " << toks[2];

Вывод:

apple, orange, kiwi

Демо: http://www.ideone.com/kC8FZ

Примечание: он будет работать до тех пор, пока между каждым словом и | будет по крайней мере одно пространство. Это означает, что он НЕ будет работать, если у вас есть это:

string s = "apple|orange|kiwi";

Boost - это хорошо, если вы хотите надежное решение. И если вы не хотите использовать boost по какой-либо причине, я бы предложил вам посмотреть этот блог:

Элегантные способы токенизации строк

В нем объясняется, как вы можете токенизировать свои строки, используя только один пример.