C++中怎样在输入流中区别int类型和字符类型?(进一步的问题,有补充浮点数的情况)

在实际测试中,使用@whistler 君及@精英王子 君的方法时,的确可以识别字符类型(如a,+等),但若输入浮点数类型(如1.2)仍然会跳出循环进入下一步。而我希望的是除了某几个特定整数(如1,2,3)外其他所有的非法输入都能给出报错结果并且不影响重复输入,如果能对不同的错误(字符,非要求整数,浮点数)提示不同的信息则更佳。请问诸位如何解决浮点数输入时跳出报错循环的情况?另外既然跳出了循环那x的值是几呢(经测试,输入1.2,值为1)?算是强制类型转换吗?
-----------------------原问题---------------------------------------------------------------------
有一个位置我需要输入整数,int x;cin>>x,若故意输入一个字符,则此处会无限循环。请问如何在输入为字符时(如a)将其分辨出来以给出错误信息呢?多谢诸位高手。
-----------------------------------------------------------------------------------------------------
@whisky 君的方案贴一下,未授权,望谅解。
int read(){
char c;
while( c= getchar(), !isdigit(c) );
int r= c-'0';
while( c= getchar(), isdigit(c) ) r= r*10 + c-'0';
return r;
}
这个是我平时写题目用的读入优化能自动判断字符和数字。只不过没有警告功能。要警告的话。。可能是这样的。
int read(){
char c;
while( gets(&c))
{
if(!isdigit(c))cout<<"NAN";
else break;
}
int r= c-'0';
while( c= getchar(), isdigit(c) ) r= r*10 + c-'0';
return r;
} 第二个没调过不知道能不能用- -

推荐  (0) | 1人关注关注
7个答案
3 0

精英王子高中退学,独立开发者,独立博客作者,深度 Git...

2012-06-19 21:09

#include <iostream>
using namespace std;
int main()
{
int num;

cin.clear();//清空上次的错误信息

cin>>num;//在这里我们期望输入一个数字

if(cin.good()) //如果成功了
{
cout<<"你输入的数字是"<<num<<endl;
}
else //如果没成功(输入的不是数字)
{
cout<<"输入有误"<<endl;
cin.ignore();//丢弃缓冲区中错误的输入
}
}

//------------分割线--------------
#include <iostream>
using namespace std;
int main()
{
int num;
//如果我们要用户输入一个数字,可以这么做:

cout<<"请输入一个数字:";

while(true) //一直循环
{
cin.clear();//清空上次的错误信息

cin>>num; //从键盘读取输入

if(cin.good()) //如果成功了
break; //退出循环
else
{
//下一句是丢弃缓冲区中错误的输入
//这很重要,否则错误的输入会一直留在缓冲区里面,导致程序死循环
cin.ignore();

cout<<"输入有误,请重新输入:";
}
}

//到这里,num里面就是一个有效的数字了
cout<<"你输入的数字是"<<num<<endl;
}

2 0

whistler软件工程学生、Python爱好者

2012-06-19 21:11


cin>>x自身会返回状态的
cin.sync()是清空缓冲区
cin.clear()是清除cin可能的出错状态
以上代码均在std命名空间里面跑的~

0 0

we_cry空间信息与数字技术专业

2012-06-19 20:51

我记的 @精英王子 做过一个关于判断这是不是数字的,具体内容忘记了。。。
p.s. 这里有一个: http://technet.microsoft.com/zh-cn/library/078sfkak.aspx

0 0

为什么我直接发代码提示要审核。。。我能站内信发给你么?

0 0

CZT普通理工科生

2012-06-19 20:56

先按字符串形式输入,判断是可以是int类型后再转化为int类型

0 0

不需要区分,你怎么读它就当成是什么处理。
所以,安全起见最好是当作字符读,然后自己转换。

0 1

使用 char ch=getch(),windows下应该是ch=_getch().
然后判断 ch是'1'-'9' 还是 'a'-'z','A'-'Z'
然后通过 atoi函数可以将ch转成数字,而字符型当然不需要了。
一个个接收键盘输入。然后放入数组里面。
其他事情就自己可以判断了。
自己先转个msdn简化版 可以查询一下函数。

查看更多

添加回答

登录 后回答问题,你也可以用以下帐号直接登录

相关问答

关于我们 加入果壳 媒体报道 帮助中心 果壳活动 家长监控 免责声明 联系我们 移动版 移动应用

©果壳网    京ICP证100430号    京网文[2018] 6282-492号    新出发京零字第朝200003号     京公网安备11010502007133号

违法和不良信息举报邮箱:jubao@guokr.com    举报电话:18612934101    网上有害信息举报专区    儿童色情信息举报专区