使用getline和while循环来拆分字符串

时间:2011-04-22 16:43:45

标签: c++

例如我有一个字符串:

string s = "apple | orange | kiwi";

我搜索了,有一种方法:

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

但它只能返回第一个标记“apple” 我想知道有什么办法可以返回一个字符串数组吗? 谢谢。 假设可以改变字符串s。例如,字符串s =“apple | orange | kiwi | berry”;

2 个答案:

答案 0 :(得分:30)

正如本杰明指出的那样,你在标题中自己回答了这个问题。

#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>个字符。你可能想把它们剥离。

答案 1 :(得分:4)

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

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,那么我建议你去看看这个博客:

Elegant ways to tokenize strings

它解释了如何使用一个示例来标记字符串。