C++中cin对象的clear方法和sync方法的暧昧关系
话说刚才写求最大公约数的代码时,为了提高可靠性,加入了IO错误判断,可测试结果让人不解,先看修改前的部分代码:
int a = 0, b = 0;
cout << "Please input two number to computing they GCD: ";
while (!(cin >> a >> b))
{
cin.clear(); // 将流中的所有状态值都重设为有效值
cout << "Input Error !" << endl;
cout << "Input againt: " << endl;
}
// gcd 即 Greatest Common Divisor,最大公约数.
cout << "The GCD is " << gcd(a, b) << endl;
按理(从《C++ Primer》看来的)说,输入错误时,进入了循环体,接着调用 clear 方法重设状态值,然后 cin 流对象就处于正常状态了,我们就可以重新输入两个数值以求最大公约数了。可事实是,进入循环体后,再也出不来了,一个劲儿地循环。
我调试呀调试,发现问题可能出在 clear 方法上,可是《C++ Primer》也是这么用的呀!好吧,这是我的错,我得先检讨一下再继续往下讲。为了赶进度,我在很短的时间里把《C++ Primer》看了一遍,可这只是粗略看一遍,书上的代码基本上就没有上机实践过,我错了,原谅我吧。
经过一番百度,发现原来是把 clear 的老情人 sync 给丢了。俗话说的好,男女搭配,干活不累。没了 sync,clear 自然就整天魂不守舍地徘徊不前,等待梦中情人的出现。好了,有请 sync 先生出场:
while (!(cin >> a >> b))
{
cin.sync(); // 清除输入缓冲区中的数据流,功能与 fflush(stdin) 相同.cin.clear(); // 将流中的所有状态值都重设为有效值.
cout << "Input Error !" << endl;
cout << "Input againt: " << endl;
}
恭喜 clear 女士脱离光棍行列,终于可以让我们继续输入数值了。
分析一下,当我们输入了错误的数值后,cin 对象处于错误状态,代码进入循环体,接着我们调用 clear 方法重设了 cin 对象的状态。此时,cin 对象已经处于正确状态了,但是有一点需要注意,这些状态只是用来告诉别人,我 cin 已经没有问题了。当然啦,神经病自己都会说自己没病,有病不是说句话就能好的,有病还得治。打从 cin 里塞进了垃圾数据之后,这些垃圾就没清除掉。所以得让 sync 把垃圾数据给清除掉,清除之后才可以再放有用的东西。OK,垃圾也清除了,状态也正常了,活可以继续干了。
PS: 想不想知道 clear 为什么是女性?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?