我想知道getline()函数如何在指针方面工作。 在下面的代码中,对于while条件,getline()不是从每个循环之后的ss的最开头开始,而是在它遇到的最后一个分隔符之后。我认为每次getline()工作都会改变ss,但我意识到这不是真的,因为在每个循环之后打印ss.str()总是给出原始的字符串流。所以我假设它必须要用指针做一些事情。
#include <sstream>
#include <vector>
#include <iostream>
using namespace std;
vector<int> parseInts(string str) {
stringstream ss(str);
vector<int> result;
string ele;
while(getline(ss, ele, ','))
{
result.push_back(atoi(ele.c_str()));
}
return result;
}
int main() {
string str;
cin >> str;
vector<int> integers = parseInts(str);
for(int i = 0; i < integers.size(); i++) {
cout << integers[i] << "\n";
}
return 0;
}
答案 0 :(得分:2)
我认为每次
ss
工作时getline()
都会被更改,
那是真的。
但我意识到这不是真的,因为在每个循环之后打印
ss.str()
总是给出原始的字符串流。
这并不意味着什么都没有改变。 stringstream
状态包括文本内容,该内容中的位置(以及更多):当您致电.str()
时,您获得了整个内容,但是当您使用{{1}解析某些内容时您更改了未来查询使用的排名状态,以及 - 可能 - getline
/ fail
/ bad
流状态。
答案 1 :(得分:0)
您可以在01180行中找到更多信息,例如来自gcc src code of std::istream的信息
__c = __sb->sbumpc();
通过运行函数sbumpc()
from here从输入流中读取下一个符号,该函数从streambuf读取当前符号
__ret = traits_type::to_int_type(*this->gptr());
比从程序增加指针当前位置的当前值应该读取下一个数据
this->gbump(1)
然后从流返回下一个符号,以便操作getline()
只改变streambuf的内部一个指针。但是当您为stringstream运行str()
时,从streambuf读取所有数据而不使用更改的指针。希望这有助于您在gcc的src中找到更多示例和信息