getline() 如何在指针方面工作?
how does getline() work in terms of pointer?
我想知道 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;
}
I thought that ss
is altered every time getline()
works,
没错。
but i realized that it is not true because printing ss.str()
after each loop always gives the original stringstream.
这并不意味着什么都没有改变。 stringstream
的状态包括文本内容、该内容中的位置(以及更多):当您调用 .str()
时,您将获得全部内容,但是当您使用 getline
解析一些内容时,您更改未来查询使用的位置状态,以及 - 可能 - fail
/bad
/eof
流状态。
您可以在第 01180 行的 gcc src code of std::istream 中找到更多信息,如您所见
__c = __sb->sbumpc();
通过 运行ing 函数 sbumpc()
from here 从 streambuf 读取当前符号从输入流中读取下一个符号
__ret = traits_type::to_int_type(*this->gptr());
比从程序增加当前位置指针的当前值应该读取下一个数据
this->gbump(1)
而不是 return 流中的下一个下一个符号,因此操作 getline()
只是更改 streambuf 的内部指针。但是,当您 运行 str()
for stringstream 从 streambuf 读取所有数据而不使用更改的指针时。希望这可以帮助您也可以在 gcc
的 src 中找到更多示例和信息
我想知道 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;
}
I thought that
ss
is altered every timegetline()
works,
没错。
but i realized that it is not true because printing
ss.str()
after each loop always gives the original stringstream.
这并不意味着什么都没有改变。 stringstream
的状态包括文本内容、该内容中的位置(以及更多):当您调用 .str()
时,您将获得全部内容,但是当您使用 getline
解析一些内容时,您更改未来查询使用的位置状态,以及 - 可能 - fail
/bad
/eof
流状态。
您可以在第 01180 行的 gcc src code of std::istream 中找到更多信息,如您所见
__c = __sb->sbumpc();
通过 运行ing 函数 sbumpc()
from here 从 streambuf 读取当前符号从输入流中读取下一个符号
__ret = traits_type::to_int_type(*this->gptr());
比从程序增加当前位置指针的当前值应该读取下一个数据
this->gbump(1)
而不是 return 流中的下一个下一个符号,因此操作 getline()
只是更改 streambuf 的内部指针。但是,当您 运行 str()
for stringstream 从 streambuf 读取所有数据而不使用更改的指针时。希望这可以帮助您也可以在 gcc