据我所知,在getline()
之后使用cin
时,我们需要先调用缓冲区中的换行符,然后再调用getline()
,我们通过调用cin.ignore()
来执行此操作}。
std::string name, address;
std::cin >> name;
std::cin.ignore(); //flush newline character
getline(std::cin,address);
但是当使用多个cin
时,我们不需要刷新换行符。
std::string firstname, lastname;
std::cin >> firstname;
std::cout << firstname << std::endl;
//no need to flush newline character
std::cin >> lastname;
std::cout << lastname << std::endl;
为什么?为什么cin.ignore()
在第一种情况下是必要的,而不是最后一种情况?
答案 0 :(得分:1)
因为getline()
从给定std::istream
读取直到下一个换行字符,而std::istream::operator>>()
跳过任何空格(空格,标签和换行符)。
因此,当您读取整数或浮点数时,所有尾随空格都会保留在输入流中。当您从控制台或终端读取数据时,键入数据并按Enter键,后者将保留在流中,如果您不清除它,将被getline()
捕获。
您不必清除它,因为下次您阅读std::string
时,std::istream::operator>>()
会为您跳过空格。
考虑这段代码;
std::string a, b;
std::cin >> a;
std::getline(std::cin, b);
和这个输入:
Stack Overflow<Enter>
Where developers learn.<Enter>
第一个cin
语句会读取单词Stack
,留下空格并留下Overflow<Enter>
。然后它将被getline
读取,所以
assert(b == " Overflow");
如果您在致电std::cin.ignore()
之前插入getline()
,则会转为
assert(b == "Where developers learn.");
答案 1 :(得分:0)
signed main(){
/*
* input is of next two lines
* Stack Overflow<Enter>
* Where developers learn.<Enter>
* for more about cin.ignore visit http://www.cplusplus.com/reference/istream/istream/ignore/
*/
string name, address;
cin>>name;
//cin.ignore();
//cin.ignore(256,'\n');
getline(cin,address);
cout << address << endl;
assert(address == " Overflow"); // breaks if using cin.ignore() or cin.ignore(256,'\n')
assert(address == "Overflow"); // breaks if using cin.ignore(256,'\n') OR not using any
assert(address == "Where developers learn."); // breaks if using cin.ignore() or not using ignore
}
输入输入
堆栈溢出
开发人员在哪里学习。