Использовать getline и while цикл для разделения строки
например, у меня есть строка:
string s = "apple | orange | kiwi";
и я искал, и есть способ:
stringstream stream(s);
string tok;
getline(stream, tok, '|');
но он может только вернуть первый токен "яблоко"
Интересно, есть ли способ, чтобы он мог возвратить массив строк?
Спасибо.
Предположим, что строка s может быть изменена. Например, строка s = "apple | orange | kiwi | berry";
Ответы
Ответ 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 по какой-либо причине, я бы предложил вам посмотреть этот блог:
Элегантные способы токенизации строк
В нем объясняется, как вы можете токенизировать свои строки, используя только один пример.