【发布时间】:2018-07-02 23:38:26
【问题描述】:
我测试了以下代码以澄清我对istream::getline()的理解:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
string s("abcd efgh\nijklmnopqrst");
string s1;
stringstream ss(s);
ss >> s1;
cout << s1 << endl;
ss.getline(&s1[0], 250, '\n');
cout << s1 << endl;
ss >> s1;
cout << s1 << endl;
getchar();
return 1;
}
然后打印控制台:
abcd
efg
ijklmnopqrst
但我认为应该是
abcd
efgh
ijklmnopqrst
另外,我发现调用ss.getline() 后s1 的大小与调用ss>> 后的大小相同,但再次调用ss>> 后大小会改变。谁能帮我解析一下?
【问题讨论】:
-
ss.getline(&s1[0], 250, '\n');导致缓冲区溢出,您将 5 个字符(+ 终止符)读入仅大小为 4 的字符串 -
由于
std::stringstream::getline()不支持std::string,我更喜欢使用std::getline(),它可以很好地与字符串配合使用。std::getline(ss, s1, '\n');