如何使用stringstream来分割逗号分隔的字符串

173

我有如下代码:

std::string str = "abc def,ghi";
std::stringstream ss(str);

string token;

while (ss >> token)
{
    printf("%s\n", token.c_str());
}

输出结果为:

abc
def, ghi

所以 stringstream::>> 操作符可以通过空格来分离字符串,但不能通过逗号来分离。有没有一种修改上述代码的方法,使我可以获得以下结果?

输入: "abc, def, ghi"

输出:
abc
def
ghi


8
“Splitting a string in C++”包含了关于在C++中分割字符串的所有人需要知道的内容。 - pmr
这个问题的第二个答案也回答了这个问题: https://dev59.com/k3VC5IYBdhLWcg3wnCj6#236803。 - VLL
2个回答

335
#include <iostream>
#include <sstream>

std::string input = "abc,def,ghi";
std::istringstream ss(input);
std::string token;

while(std::getline(ss, token, ',')) {
    std::cout << token << '\n';
}

abc
def
ghi


1
为什么你们总是使用 std:: 和完整的命名空间,而不是直接使用命名空间?这样做有具体的原因吗?我总觉得这样写很混乱,很难读。 - Dmitry Gusarov
28
@DmitryGusarov 这是一种习惯和良好实践。在短的示例中不重要,但在实际代码中使用using namespace std; 是不好的。更多信息可以参考 这里 - jrok
1
啊,所以听起来问题是由于C++能够在类外部拥有一个方法引起的。这也可能是为什么它从未在C# / Java中导致问题的原因。但是,在类外部拥有一个方法是一种好的实践吗?像Kotlin这样的现代语言甚至不允许静态方法。 - Dmitry Gusarov
在 Kotlin 中,您可以在类的 companion object 内声明函数,这些函数基本上是静态方法。 - akmin
这段代码短小易读,非常好,但在C++中这是最快的方法吗? - Jay
你如何将这个答案适应跳过空格?例如,如果std::string input = "abc, def, ghi";,当使用getline按逗号解析时,我想去掉空格。 - 24n8

5
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
    std::string input = "abc,def,   ghi";
    std::istringstream ss(input);
    std::string token;
    size_t pos=-1;
    while(ss>>token) {
      while ((pos=token.rfind(',')) != std::string::npos) {
        token.erase(pos, 1);
      }
      std::cout << token << '\n';
    }
}

这段代码不正确,它会生成 abcdef \n ghi 作为输出。 - Ashok Arora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接