关于istream的问题???

jp311 2002-12-11 03:10:16
int i;
cin >> i; // 1
cin.clear();
if (cin.good())
{
cin >> i; // 2
}
第一个cin >> i;的时候我输入了一个非int数据使cin状态出错.
然后用cin.clear();重置状态cin.good为true,可是我的第二个cin >> i;还是无法运行.望高人指点...
...全文
79 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinajiji 2003-02-27
  • 打赏
  • 举报
回复
int i;
cin >> i; // 1
cin.clear();
//!char c;
//!cin >> c;
fflush(stdin); //这样做更好!!!
if (cin.good())
{
cin >> i; // 2
}


liushmh 2002-12-13
  • 打赏
  • 举报
回复
昨天,专门回去看了一下,得出的结论是,我上面的说法不很准确。
在执行cin>>i后,cin会将输入的字符流保留在一个空间里面(假设其名称是ptr)如果没有输入一个int类型的数,那么iostream的执行流程就发生了变化,它在将输入的字符,比如'k'转换成int的107后,执行一个函数,从而让ptr的地址自动-1
,这个时候,再把ptr指向的值赋给i(我觉得ptr的地址空间是以i的地址+1处开始的)。也就是说每次输入时ptr都要先++,如果该输入不能匹配的话,就 -- ,并且将_status的值设为0(cin.good()的返回是{_status == 0}),所以此时,单单cin.clear()就不可以了。直接对底层的类似ptr操作也不是很安全,故我认为最好的办法是将cin中的值在赋一次,从而使得ptr可以自动增一,而不会由于不匹配而返回到原来的地方。

如以下语句

int i;
cin >> i; // 1
cin.clear();
char c;
cin >> c;
if (cin.good())
{
cin >> i; // 2
}

jp311 2002-12-11
  • 打赏
  • 举报
回复
那任何把streambuf里的数据清掉让以后的cin都恢复正常呢???
望liushmh继续指导
liushmh 2002-12-11
  • 打赏
  • 举报
回复
if (cin.good())
{
cin >> i; // 2
}
这段代码其实执行了,但是cin的streambuf里面的数据没有被清除掉,这样,又一次执行cin >>i时,还是把原来在streambuf里的数据又输出了一边给i.
你可以
cin.clear();
cout << cin.good() << endl; //1
if (cin.good())
{
cin >> i; // 2
}
cout << cin.good() << endl; //0
看看,就明白了。

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧