下面这个代码中,输入浮点数,为什么第二次cin.fail()才为true?

aikill 2008-04-08 07:41:17
#include<iostream>
using namespace std;
void main()
{
int i=0;
int inval=0;
for (i=1; i<4; i++)
{
cin>>inval;
if (cin.fail())
{
cin.ignore();
cin.clear();
}
}
cout<<inval<<endl;
}
...全文
238 21 打赏 收藏 举报
写回复
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2008-04-09
  • 打赏
  • 举报
回复
楼主现在应该明白高手和低手就区别在这“试一试”上了。
wangya55 2008-04-09
  • 打赏
  • 举报
回复
en
aikill 2008-04-09
  • 打赏
  • 举报
回复
呵呵,向高手学习,主要是想弄清楚原理,光是试一试还是不够。
aikill 2008-04-08
  • 打赏
  • 举报
回复
class sentry {
public:
explicit sentry(_Myt& _Is, bool _Noskip = false)
: _Ok(_Is.ipfx(_Noskip)) {}
operator bool() const
{return (_Ok); }
private:
bool _Ok;
};
bool ipfx(bool _Noskip = false)
{if (good())
{if (tie() != 0)
tie()->flush();
if (!_Noskip && flags() & skipws)
{const _Ctype& _Fac = _USE(getloc(), _Ctype);
_TRY_IO_BEGIN
int_type _C = rdbuf()->sgetc();
while (!_Tr::eq_int_type(_Tr::eof(), _C)
&& _Fac.is(_Ctype::space,
_Tr::to_char_type(_C)))
_C = rdbuf()->snextc();
_CATCH_IO_END }
if (good())
return (true); }
setstate(failbit);
return (false); }

_Myt& ignore(streamsize _N = 1, int_type _Di = _Tr::eof())
{iostate _St = goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (_Ok && 0 < _N)
{_TRY_IO_BEGIN
for (; ; )
{int_type _C;
if (_N != INT_MAX && --_N < 0)
break;
else if (_Tr::eq_int_type(_Tr::eof(),
_C = rdbuf()->sbumpc()))
{_St |= eofbit;
break; }
else
{++_Chcount;
if (_C == _Di)
break; }}
_CATCH_IO_END }
setstate(_St);
return (*this); }

分析了一下istream,果然是goodbit时,ignore才起作用。
知其然,而知所以然,呵呵,自己动手,丰衣足食。
ryfdizuo 2008-04-08
  • 打赏
  • 举报
回复
同意ls,
aikill 2008-04-08
  • 打赏
  • 举报
回复
一和二都是的。
提问只是想深层次的探讨一下,如果都只是试一下而已,那么也只是肤浅的理解。
高手和新手的区别在哪里?难道仅仅是因为喜欢试一下吗。
论坛如果只是回答是与不是的地方,那么还不如自己掷色子来看结果了,反正别人只回答是与不是也不明白为什么。
呵呵,就事论事,不是攻击谁。
就呆在云上 2008-04-08
  • 打赏
  • 举报
回复
单步执行一下就可以了
如果输入2.0
第一次可以读到一个2
第二次就是一个.
然后调用cin.ignore();cin.clear(); 涮洗缓冲区,里面就啥都没有了
打印就是2

但是如果输入一个s字符
就直接
cin.ignore();
cin.clear();
打印的就是0
taodm 2008-04-08
  • 打赏
  • 举报
回复
浮点的开头部分是整数!!!
Supper_Jerry 2008-04-08
  • 打赏
  • 举报
回复
你也可以输入2a3,是一样的,只要是前面有数字,cin就会读入。但是当读入第一个后
缓冲区中就整数可以读入了。所以cin就fail了。
hurryboylqs 2008-04-08
  • 打赏
  • 举报
回复
哦,没看清楚,其实你已经描述的很清楚了,
如果你第一次就是输入浮点数,比如 2.3 那么这个2是能够被cin读到缓冲区里的,所以第一次不会出现非法,第二次遇到.时就非法了
aikill 2008-04-08
  • 打赏
  • 举报
回复
第一次输入浮点数后,fail不为真,然后下一次循环中就不能输入了,而且fail为真了。
那么既然出错,为什么不是在当次循环中出错,而是要到下一次循环。
hurryboylqs 2008-04-08
  • 打赏
  • 举报
回复
你问题描述的不清楚,总之你这个代码要求输入3个整数,每次输入都判断是不是合法输入,如果输入不合法就
cin.fail()为真啦
aikill 2008-04-08
  • 打赏
  • 举报
回复
控制台程序。
hurryboylqs 2008-04-08
  • 打赏
  • 举报
回复
你是怎么输入的?
zgjxwl 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 aikill 的回复:]
有两个问题:
一、
cin.ignore(); 默认情况下只清除一个字符?
二、
cin.fail();为true时,使用cin.ignore()没有用?
[/Quote]

多自己试试兄弟,引用taodm的一句话
节省别人的时间就是再提高自己,好好理解理解这句话
lsmdiao0812 2008-04-08
  • 打赏
  • 举报
回复
学习
taodm 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 aikill 的回复:]
有两个问题:
一、
cin.ignore(); 默认情况下只清除一个字符?
二、
cin.fail();为true时,使用cin.ignore()没有用?
[/Quote]
自己写代码试一下就知道了。
jieao111 2008-04-08
  • 打赏
  • 举报
回复
2)没听说过
jieao111 2008-04-08
  • 打赏
  • 举报
回复
1)是的
aikill 2008-04-08
  • 打赏
  • 举报
回复
有两个问题:
一、
cin.ignore(); 默认情况下只清除一个字符?
二、
cin.fail();为true时,使用cin.ignore()没有用?

加载更多回复(1)
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-08 07:41
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下