使用getline和while循环分割字符串

use getline and while loop to split a string

本文关键字:分割 字符串 循环 while getline 使用      更新时间:2023-10-16

例如,我有一个字符串:

string s = "apple | orange | kiwi";

和我搜索,有一个方法:

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

但是它只能返回第一个标记"apple"我想知道有没有什么方法可以让它返回一个字符串数组?谢谢你!让我们假设字符串s可以被改变。例如,字符串s = "apple | orange | kiwi | berry";

正如Benjamin所指出的,你在标题中自己回答了这个问题。

#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>字符。你可能想把它们去掉。

由于每个单词和|之间有空格,您可以这样做:

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

Demo: http://www.ideone.com/kC8FZ

注意:只要每个单词和|之间至少有一个空格,它就会工作。这意味着,如果你有这个,它将不起作用:

string s = "apple|orange|kiwi";

如果您需要健壮的解决方案,

Boost是一个不错的选择。如果你出于某种原因不想使用boost,那么我建议你看看这个博客:

标记字符串的优雅方法

它解释了如何标记字符串,仅举一个例子。

stringstream stream(s);
std::vector<std::string> vec_res;
string tok;
while (getline(stream, tok, '|')) {
    vec_res.push_back(tok);
}