3 回答
TA贡献1852条经验 获得超1个赞
忽略正如名称所暗示的那样。
它不会“丢弃”你不需要的东西,它会忽略你调用它时指定的字符数量,直到你指定为断点的字符。
它适用于输入和输出缓冲区。
从本质上讲,对于std::cin
语句,在执行getline
调用之前使用ignore ,因为当用户输入内容时std::cin
,它们会按Enter键并且'\n'
char进入cin
缓冲区。然后,如果您使用getline
,它将获取换行符char而不是您想要的字符串。所以你做了一个std::cin.ignore(1000,'\n')
,那应该清除缓冲区到你想要的字符串。(1000用于在指定的断点之前跳过特定数量的字符,在本例中为\ n换行符。)
TA贡献1839条经验 获得超15个赞
你正在考虑这个错误的方法。您每次都在考虑逻辑步骤cin
或getline
使用它们。防爆。先问一个号码,然后问一个名字。这是错误的思考方式cin
。所以你遇到竞争条件,因为你假设每次请求输入时流都是清晰的。
如果你纯粹为输入编写程序,你会发现问题:
void main(void){ double num; string mystr; cin >> num; getline(cin, mystr); cout << "num=" << num << ",mystr=\'" << mystr << "\'" << endl;}
在上面,你在想,“首先得到一个数字。” 所以你输入123
按回车键,你的输出就会出现num=123,mystr=''
。这是为什么?这是因为在你拥有的流中123\n
,当它仍然在流中时被123
解析为num
变量\n
。getline
默认情况下,读取doc 函数会istream
直到\n
遇到a。在这个例子中,因为\n
它在流中,看起来它“跳过”它但它正常工作。
要使上述工作正常,您必须输入123Hello World
正确输出的内容num=123,mystr='Hello World'
。那个,或者你把它放在它cin.ignore
之间cin
,getline
以便它会突破你期望的逻辑步骤。
这就是您需要ignore
命令的原因。因为您在逻辑步骤而不是流形式中考虑它,所以您遇到竞争条件。
采取学校常见的另一个代码示例:
void main(void){ int age; string firstName; string lastName; cout << "First name: "; cin >> firstName; cout << "Last name: "; cin >> lastName; cout << "Age: "; cin >> age; cout << "Hello " << firstName << " " << lastName << "! You are " << age << " years old!" << endl;}
以上似乎是合乎逻辑的步骤。首先询问名字,姓氏,然后是年龄。因此,如果您John
输入,则Doe
输入,然后19
输入,应用程序将执行每个逻辑步骤。如果您在“流”中想到它,您只需输入John Doe 19
“名字:”问题,它也会起作用,并且似乎跳过剩下的问题。为了使上述步骤按逻辑步骤工作,您需要为ignore
问题中的每个逻辑中断提供剩余的流。
记住要记住你的程序输入,因为它是从“流”读取而不是逻辑步骤。每次调用cin
它都是从流中读取的。如果用户输入错误的输入,这会创建一个相当错误的应用程序。例如,如果您输入了cin >> double
预期a的字符,则应用程序将产生一个相当(看似)怪异的输出。
TA贡献2016条经验 获得超9个赞
如果要手动从输入流中丢弃特定数量的字符。
一个非常常见的用例是使用它来安全地忽略换行符,因为cin有时会留下换行符,你必须转到下一行输入。
简而言之,它为您提供处理流输入时的灵活性。
- 3 回答
- 0 关注
- 970 浏览
添加回答
举报