cin在未成功赋值,比如类型输入错误时,为变量赋值0。
↑此时可用cin.rdstate()检测错误类型。
返回0(即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作
goodbit 无错误
Eofbit 已到达文件尾
failbit 非致命的输入/输出错误,可挽回
badbit 致命的输入/输出错误,无法挽回 若在输入输出类里.需要加ios::标识符号
因此用cin.ignore()清除缓冲区之前,必须用cin.clear()将错误状态恢复才能进行操作。
而对于cin.sync()来说,对于 std::cin 这些标准库「自带」的输入流来说,调用 sync() 是「实现定义」的行为
所以此处调了 sync() 以后清空、恢复原状、什么都不干都是可以的,如果没有得到预期的效果的话,可以查看自己的编译器(标准库实现)的说明文档,上面应该有写明它所使用的是哪种行为。
总之就是,通用的手段是用cin.ignore(),cin.sync()是一种依赖于编译器的不可靠的手段。