社区
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;
}
...全文
327
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的用法以及
输入
缓冲区
输入
缓冲区:这是一个我们键盘
输入
与编译器读取之间的一个缓冲区域,编译器并不是直接读取我们在键盘上
输入
的信息,而是从
输入
缓冲区
中
读取的信息。我们使用scanf、getchar等
输入
函数时,并不是直接从键盘
中
去获取,而是由键盘打到
输入
缓冲区
中
,然后scanf,getchar等
输入
函数再从
输入
缓冲区里面去获取数据。类似于输出函数,
输入
函数(scanf,getchar)也存在
输入
缓存,并且这些
输入
函数属于阻塞函数。
关于C++的
cin
的错误
输入
的问题以及解决办法
最近学校期末用C++做一个实训项目,在用到
cin
获得用户
输入
的时候考虑到用户
输入
的不确定性,要规范
cin
返回的值,否则会造成意想不到的结果。 先来一个简单的例子: int num_input;
cin
>>num_input; while(num_input<=0) { cout<<"请
输入
正数"<<endl;
cin
>>num_input;...
【C++】关于
输入
流
fail
()的用法
【C++】关于
输入
流
fail
()的用法 问题:
cin
.
fail
()来判断当前的
输入
的类型和预期的是否相同,如不同
cin
.
fail
()返回
true
。如何获取
cin
.
fail
()所返回的
true
值和当前
输入
的值? 解决: #include <iostream> using namespace std; int main() { int a; char b;
cin
>> a; if(
cin
.
fail
())//
输入
的为int时返回false,char时返回ture { c
C语言笔记--
cin
.
fail
()
cin
.
fail
()
cin
.
fail
判断流操作是否失败.如果
输入
失败就会返回
true
. int a;
cin
>>a; if(
cin
.
fail
()) { cout } else { .. } 如果要
输入
一个整数,你
输入
的不是整数(是字母等)
输入
一个字符串int 1 0,怎么把int 和10分别提取出来呢?
cin
.good(),
cin
.
fail
(),
cin
.clear()
cin
.good(),原来的值默认为1。如果
输入
的值与定义的变量类型不同,则输出
cin
.good()为0; 1 int a; 2 cout<<"
输入
一个字母:"<<endl; 3
cin
>>a; //我们用键盘
输入
一个char字母,而不是
输入
int。这时int型变量
中
放了char型数据,发生错误,所以
fail
bit置1 4 cout<&...
C++ 语言
65,214
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章