为什么在使用" getline"时需要cin.ignore()在" cin"之后,但在使用" cin"时不需要。多次?

时间:2017-11-27 07:32:56

标签: c++ cin getline

据我所知,在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()在第一种情况下是必要的,而不是最后一种情况?

2 个答案:

答案 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
}

输入输入

  

堆栈溢出

     

开发人员在哪里学习。