社区
C++ 语言
帖子详情
下面这个代码中,输入浮点数,为什么第二次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;
}
...全文
323
21
打赏
收藏
下面这个代码中,输入浮点数,为什么第二次cin.fail()才为true?
#include using namespace std; void main() { int i=0; int inval=0; for (i=1; i>inval; if (cin.fail()) { cin.ignore(); cin.clear(); } } cout<<inval<<endl; }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
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)
cin
.
fail
(),
cin
.clear(),
cin
.ignore的用法以及
输入
缓冲区
当尝试将非整型字符
输入
到整型变量时,C++的
fail
bit会设置为1,阻止进一步的
输入
。可以通过
cin
.clear()复位
fail
bit,但需结合
cin
.ignore()清除
输入
缓冲区的残留字符,以便正常进行下一次
输入
。
cin
.sync()在某些编译器可能无效,可以使用自定义函数如clearBuff()来代替。
输入
缓冲区是键盘
输入
和编译器读取之间的临时存储,影响scanf和
cin
等
输入
函数的行为。
关于C++的
cin
的错误
输入
的问题以及解决办法
本文探讨了C++
中
cin
获取用户
输入
时可能遇到的问题,特别是非数字
输入
导致的死循环,并提供了解决方案。介绍了如何使用
cin
.
fail
(),
cin
.clear()和
cin
.ignore()等函数进行错误状态检查和缓冲区清理,确保程序稳定运行。
【C++】关于
输入
流
fail
()的用法
本文详细介绍了C++
中
输入
流
fail
()函数的使用方法,包括如何判断
输入
类型是否符合预期,以及如何处理错误状态。通过实例演示了在
输入
不符合预期类型时,如何清除错误状态并重新获取
输入
。
【整理】【C++基础】
cin
输入
本文详细介绍了C++
中
cin
输入
的类型敏感性,以及
输入
格式错误时如何处理。当
cin
遇到无效字符或文件结束符时,会进入错误状态,此时需要通过
cin
.clear()清除错误状态,或者使用
cin
.ignore()忽略错误
输入
。同时,文章讨论了
cin
的各种状态,包括
fail
(), bad(), eof(), good(),并提供了错误
输入
时的处理步骤。 104535974,8052840,HTTP协议详解:Request、Response与Servlet对象应用,['HTTP协议', 'Servlet', 'Java Web']
C语言笔记--
cin
.
fail
()
这篇博客介绍了C语言
中
cin
.
fail
()函数的使用,用于检测
输入
流操作是否失败。当
输入
不符合预期(如在期望整数时
输入
字母)时,
cin
.
fail
()会返回
true
。示例
代码
展示了如何根据
cin
.
fail
()的返回值来判断并处理非法
输入
的情况。
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章