【问题标题】:use getline and while loop to split a string使用 getline 和 while 循环拆分字符串
【发布时间】:2011-04-22 16:43:44
【问题描述】:

例如我有一个字符串:

string s = "apple | orange | kiwi";

我搜索了一下,有一种方法:

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

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

【问题讨论】:

  • 你在标题中回答了你的问题。

标签: c++


【解决方案1】:

正如 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`
}

请注意,您的标记仍将具有尾随/前导 &lt;space&gt; 字符。你可能想把它们去掉。

【讨论】:

  • 我见过的最简单、最优雅的 C++ 字符串标记器之一。
  • @scai:谢谢!事后看来,它需要更多 const,并在这里或那里换行。
  • 很好的解决方案!非常感谢!
  • 这样我就更清楚了,实际发生了什么:std::string each; while(std::getline(split, each, split_char)) { tokens.push_back(each); }
  • @gebbissimo 是的,这是编写循环的另一种方式
【解决方案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,那么我建议您查看此博客:

Elegant ways to tokenize strings

它仅通过一个示例说明了如何对字符串进行标记。

【讨论】:

  • 但这似乎是硬代码。如果字符串 s 改变了会发生什么?
  • 可能需要注意的是,这是可行的,因为提取运算符默认会跳过空格。我更喜欢boost::tokenzier 而不是这种方法。
  • 否则,如果你想要一个通用解析器并且不介意使用 boost 库,我建议使用标记器。 boost.org/doc/libs/1_36_0/libs/tokenizer/index.html
  • @user552279:在什么意义上改变了?正如我所说,只要每个单词和| 之间有空格,它就可以工作。
  • @user:理想情况下,您会使用std::vector&lt;std::string&gt; 来说明这一点,但这不是最有效的示例。
【解决方案3】:
stringstream stream(s);
std::vector<std::string> vec_res;
string tok;
while (getline(stream, tok, '|')) {
    vec_res.push_back(tok);
}

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 2015-06-09
    • 2014-09-19
    • 2013-03-03
    • 1970-01-01
    • 2019-12-08
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多