获取字符串流 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 >> a >> 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++ 的剩余部分的主要内容,如果未能解决你的问题,请参考以下文章