获取字符串流 C++ 的剩余部分

Posted

技术标签:

【中文标题】获取字符串流 C++ 的剩余部分【英文标题】:Getting the remainder of a stringstream c++ 【发布时间】:2013-04-18 03:04:46 【问题描述】:

我有一个字符串流,我需要将第一部分取出,然后将其余部分放入单独的字符串中。例如,我有字符串 "This is a car",我需要以 2 个字符串结尾:a = "This"b = "is a car"

当我使用 stringstream 获取使用<< 的第一部分时,然后我使用.str() 转换为一个字符串,这当然给了我整个东西“This is a car"。我怎样才能让它发挥作用我要吗?

【问题讨论】:

【参考方案1】:
string str = "this is a car";

std::stringstream ss;
ss << str;

string a,b;
ss >> a;
getline(ss, b);

编辑: 更正感谢@Cubbi:

ss >> a >> ws;

编辑:

此解决方案在某些情况下(例如我的测试用例)可以处理换行符,但在其他情况下会失败(例如 @rubenvb 的示例),而且我还没有找到一种干净的方法来修复它。 我认为@tacp 的解决方案更好、更健壮,应该被接受。

【讨论】:

这使得 b " is a car",成为 "is a car"ss &gt;&gt; a &gt;&gt; ws; 怎么样? 谢谢,我使用 string.erase(0, 1) 来消除空间。 @Cubbi:好点,但您的解决方案只假设一个空格字符。使用b.erase(0,b.find_first_not_of("...")) 之类的东西会让我感觉更安全。 @Beta std::ws 消耗所有空格。 @Cubbi:该死!我不知道。【参考方案2】:

您可以这样做:首先获取整个字符串,然后获取第一个单词,使用substr 获取其余部分。

 stringstream s("This is a car");
 string s1 = s.str();
 string first;
 string second;

 s >> first;
 second = s1.substr(first.length());
 cout << "first part: " << first <<"\ second part: " << second <<endl;

在 gcc 4.5.3 输出中对此进行测试:

first part: This 
second part: is a car

【讨论】:

值得注意的是,如果原始字符串实际上是" This is a car ",这将不起作用 你也可以不用变量 s1 来做,只要做 s.str().substr(first.length());【参考方案3】:

您可以在读出第一位后在流上执行getline....

【讨论】:

【参考方案4】:

另一种方法是使用 rdbuf:

stringstream s("This is a car");
string first;
stringstream second;

s >> first;
second << s.rdbuf();
cout << "first part: " << first << " second part: " << second.str() << endl;

如果您最终要将结果输出到流而不是字符串,这可能是一个不错的选择。

【讨论】:

以上是关于获取字符串流 C++ 的剩余部分的主要内容,如果未能解决你的问题,请参考以下文章

C++:字符串流有啥好处?

C++学习50 对字符串流的读写

如何使用 C++ 字符串流附加 int?

C++: I/O流详解——串流

stringstream字符串流的妙用

字符串流有啥意义? [复制]