gpt4 book ai didi

c++ - 为什么在不使用 getline() 时必须使用 cin.ignore?

转载 作者:行者123 更新时间:2023-12-03 07:00:22 25 4
gpt4 key购买 nike

我写了以下代码

#include <iostream>
#include <string>

using namespace std;

int main()
{
int i;
while(true)
{
cout << "\nEnter an integer: ";
cin >> i;
if( cin.good() )
{

break;
}
cin.clear();
cout << "Incorrect input";
}
cout << "integer is "<< i;

return 0;
}
但是,当我执行代码时,它会无限打印 Enter a number: Incorrect Input在我输入第一个输入后 nine或任何不是整数的东西。
我尝试了很多东西,最后得到了一个代码,但我不明白为什么我要使用 cin.ignore()当我不使用时 getline() .我最终得到的代码:
#include <string>

using namespace std;

int main()
{
int i;
while(true)
{
cout << "\nEnter an integer: ";
cin >> i;
if( cin.good() )
{
break;
}
cin.clear();
cout << "Incorrect input";
cin.ignore(10,'\n'); //Why this line if I am not using getline?
}
cout << "integer is "<< i;

return 0;
}
据我所知,我们必须使用 cin.ignore()使用前 getline()因为与 cin>> 不同,它不会忽略 '\n' 字符。然而,我在代码中没有使用 getline() 所以为什么会出现错误。能不能解释一下...

最佳答案

基本上是 ignore()读取该行的其余部分并将其删除。您想这样做是因为否则您只会尝试一次又一次地重新读取相同的值并且总是失败。
例子:

 Enter an integer:
Fify Six <-- If I typed that.
然后这一行:
 cin >> i;                 // This will fail (as i is an int)
// and there is no integer value on the input.
所以你无法读取值。注意:这不会删除它仍在等待读取的输入。因此,如果您只是清除状态并重试,您将再次失败,因为您试图重复读取相同的值(总是失败)。
现在您可以删除单个字符并将其扔掉,然后再试一次。这将是尝试并最终解决此问题的有效技术。它会在 7 次尝试后到达那里(每次尝试扔掉一个角色)。
但通常你只是扔掉整条线。这是因为 std::cin被缓冲并且一次只传递给应用程序一行。即您输入一些文本,然后按回车键,此时缓冲区会刷新到您的代码中以进行解析。如果用户做错了什么,通常整行都是错误的,因此丢弃它只会进入下一组用户输入。
您应该注意到这个缓冲输入模型与 std::cout 相关联。流。它确保当您尝试从 std::cin 中读取时输出流会自动刷新,因此您在输入上回答的问题与输出中询问的内容相匹配。这导致用户每行有 1 个问题和 1 个答案。所以不正确的输入可以简单地一次删除一行。
现在这并不能阻止用户滥用系统并在一行中输入多个答案。当答案错误时,所有这些都会同时被忽略。

关于c++ - 为什么在不使用 getline() 时必须使用 cin.ignore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64668526/

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