我何时以及为什么需要在C ++中使用cin.ignore()?

我何时以及为什么需要在C ++中使用cin.ignore()?

我用C ++编写了一个非常基本的程序,要求用户输入一个数字,然后输入一个字符串。令我惊讶的是,在运行程序时,它永远不会停止询问字符串。它只是跳过了它。在对StackOverflow进行一些阅读后,我发现我需要添加一行说:

cin.ignore(256, '\n');

在获取字符串输入的行之前。添加修复问题并使程序正常工作。我的问题是为什么C ++需要这一cin.ignore()行,我如何预测何时需要使用cin.ignore()

这是我写的程序:

#include <iostream>#include <string>using namespace std;int main(){
    double num;
    string mystr;

    cout << "Please enter a number: " << "\n";
    cin >> num;
    cout << "Your number is: " << num << "\n";
    cin.ignore(256, '\n'); // Why do I need this line?
    cout << "Please enter your name: \n";
    getline (cin, mystr);
    cout << "So your name is " << mystr << "?\n";
    cout << "Have a nice day. \n";}


jeck猫
浏览 971回答 3
3回答

小怪兽爱吃肉

忽略正如名称所暗示的那样。它不会“丢弃”你不需要的东西,它会忽略你调用它时指定的字符数量,直到你指定为断点的字符。它适用于输入和输出缓冲区。从本质上讲,对于std::cin语句,在执行getline调用之前使用ignore&nbsp;,因为当用户输入内容时std::cin,它们会按Enter键并且'\n'char进入cin缓冲区。然后,如果您使用getline,它将获取换行符char而不是您想要的字符串。所以你做了一个std::cin.ignore(1000,'\n'),那应该清除缓冲区到你想要的字符串。(1000用于在指定的断点之前跳过特定数量的字符,在本例中为\ n换行符。)

紫衣仙女

你正在考虑这个错误的方法。您每次都在考虑逻辑步骤cin或getline使用它们。防爆。先问一个号码,然后问一个名字。这是错误的思考方式cin。所以你遇到竞争条件,因为你假设每次请求输入时流都是清晰的。如果你纯粹为输入编写程序,你会发现问题:void&nbsp;main(void){ &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;num; &nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;mystr; &nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;>>&nbsp;num; &nbsp;&nbsp;&nbsp;&nbsp;getline(cin,&nbsp;mystr); &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;"num="&nbsp;<<&nbsp;num&nbsp;<<&nbsp;",mystr=\'"&nbsp;<<&nbsp;mystr&nbsp;<<&nbsp;"\'"&nbsp;<<&nbsp;endl;}在上面,你在想,“首先得到一个数字。”&nbsp;所以你输入123按回车键,你的输出就会出现num=123,mystr=''。这是为什么?这是因为在你拥有的流中123\n,当它仍然在流中时被123解析为num变量\n。getline默认情况下,读取doc&nbsp;函数会istream直到\n遇到a。在这个例子中,因为\n它在流中,看起来它“跳过”它但它正常工作。要使上述工作正常,您必须输入123Hello World正确输出的内容num=123,mystr='Hello World'。那个,或者你把它放在它cin.ignore之间cin,getline以便它会突破你期望的逻辑步骤。这就是您需要ignore命令的原因。因为您在逻辑步骤而不是流形式中考虑它,所以您遇到竞争条件。采取学校常见的另一个代码示例:void&nbsp;main(void){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;age; &nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;firstName; &nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;lastName; &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;"First&nbsp;name:&nbsp;"; &nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;>>&nbsp;firstName; &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;"Last&nbsp;name:&nbsp;"; &nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;>>&nbsp;lastName; &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;"Age:&nbsp;"; &nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;>>&nbsp;age; &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;"Hello&nbsp;"&nbsp;<<&nbsp;firstName&nbsp;<<&nbsp;"&nbsp;"&nbsp;<<&nbsp;lastName&nbsp;<<&nbsp;"!&nbsp;You&nbsp;are&nbsp;"&nbsp;<<&nbsp;age&nbsp;<<&nbsp;"&nbsp;years&nbsp;old!"&nbsp;<<&nbsp;endl;}以上似乎是合乎逻辑的步骤。首先询问名字,姓氏,然后是年龄。因此,如果您John输入,则Doe输入,然后19输入,应用程序将执行每个逻辑步骤。如果您在“流”中想到它,您只需输入John Doe 19“名字:”问题,它也会起作用,并且似乎跳过剩下的问题。为了使上述步骤按逻辑步骤工作,您需要为ignore问题中的每个逻辑中断提供剩余的流。记住要记住你的程序输入,因为它是从“流”读取而不是逻辑步骤。每次调用cin它都是从流中读取的。如果用户输入错误的输入,这会创建一个相当错误的应用程序。例如,如果您输入了cin >> double预期a的字符,则应用程序将产生一个相当(看似)怪异的输出。

慕沐林林

如果要手动从输入流中丢弃特定数量的字符。一个非常常见的用例是使用它来安全地忽略换行符,因为cin有时会留下换行符,你必须转到下一行输入。简而言之,它为您提供处理流输入时的灵活性。
打开App,查看更多内容
随时随地看视频慕课网APP