gpt4 book ai didi

c++ - 为什么在 "getline"之后使用 "cin"时需要 cin.ignore() 而在多次使用 "cin"时不需要?

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:30 32 4
gpt4 key购买 nike

据我所知,在 cin 之后使用 getline() 时,我们需要先刷新缓冲区中的换行符,然后再调用 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() 在第一种情况下是必需的,但在最后一种情况下不是?

最佳答案

因为 getline()从给定的 std::istream 读取直到下一个换行符 , 而 std::istream::operator>>() 跳过任何空格(空格、制表符和换行符)。

因此,当您读取整数或 float 时,所有尾随空格都会留在输入流中。当您从控制台或终端读取时,您键入数据并按 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.");

关于c++ - 为什么在 "getline"之后使用 "cin"时需要 cin.ignore() 而在多次使用 "cin"时不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47505826/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com