How*_*Gee 2 c++ iostream ignore clear
出于某种原因,当我到达某个地点时,我必须按Enter两次才能让它提交.我添加了clear以防止它跳过输入和ignore()以防止它在缓冲区中保留任何额外的字符.我输入我的输入然后它下降到一个新的行,我Enter再次点击它输入输入并继续该程序没有问题,但我想知道为什么.这是一段代码片段:
cin.ignore();
cout << "Enter Student Major (ex. COSC): ";
cin.getline(student.major, 6);
for(int i = 0; i < sizeof(student.major); i++)
student.major[i] = toupper(student.major[i]);
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Run Code Online (Sandbox Code Playgroud)
有什么建议?
在我看来,你正在折腾太多cin.ignore()
,不知道为什么需要它们以及何时将它们放在那里.
有两种常见情况cin.ignore()
需要"使输入正常":
在这两种情况下,您都希望从输入缓冲区中删除虚假字符; 如果没有任何这样的字符(这可能是你的程序中发生的事情),cin.ignore()
将暂停执行并等待用户输入 - 毕竟,你要求它忽略一些字符,并且该死的,它会服从它的命令.
(虽然ignore()
默认情况下只会"吃掉"一个字符,无论它是什么,执行都会暂停,直到找到换行符,因为默认情况下cin
是行缓冲 - 在收到换行符之前不会检查新输入)
cin.ignore()
如果在执行格式化输入操作(即使用运算符)后执行无格式输入操作(如getline
),则通常需要调用.>>
发生这种情况是因为>>
操作符将换行符留在输入缓冲区中; 如果你只执行格式化的输入操作(默认情况下它们在尝试解释输入之前跳过所有空格),这不是问题,但是如果之后你做了无格式输入则是一个问题:getline
默认情况下读取直到找到换行符,所以"虚假换行"将使其立即停止阅读.
所以,在这里你通常会调用cin.ignore(...)
call来在你连续执行的最后一次格式化输入操作之后摆脱换行,保证输入缓冲区为空.之后,你可以getline
毫无畏惧地直接打电话,因为你知道你把缓冲区留空了.
相反,将它放在任何代码之前是一个坏主意,getline
就像你在代码中所做的那样,因为可能存在导致getline
输入缓冲区干净的代码路径,因此ignore
调用将阻塞.
当istream
在格式化的输入操作中遇到错误时,它会在缓冲区中留下"坏"字符,因此如果您重试该操作,您将无休止地陷入困境,因为违规者仍然存在.通常的clear()/ignore()
习惯用来救援,从输入缓冲区中删除整个违规行.
同样,您不会将clear()/ignore()
序列随机放置,而只是在您从格式化的输入操作(设置流的failbit)获得输入错误之后.
现在,除了这些情况之外,使用它是不常见的cin.ignore()
(除非你真的想跳过字符); 不要随意散布"只是为了安全",因为否则你会遇到你描述的问题.