"<<"两边的数据类型不一致时,会怎样处理?

lijiao7073 2010-03-17 07:59:52
在程序运行时,如果输入数字,则程序中的循环正常。但是如果输入非数字字符,比如字母,就会一直循环,不停止,也无法再接收输入。
看了下,问题只能出在cin>>ch上面了。
分析了下,应当是>>两端的数据类型不一致的原因。
但是我很好奇,这时>>是怎样处理的,为什么无法再接收输入了呢?

还有我非常想知道,有没有什么资料详细的解释了语言比如C/C++中的函数、重载运算符的实现方法的,例如源码之类的?

#include<iostream>
using namespace std;

void main()
{
bool k=true;
int ch=0;
while(k)
{
cout<<"------------------------------------------------------------------|"<<endl;
cout<<"| 1、输入文件路径 2、计算灰度 |"<<endl;
cout<<"| 3、显示灰度 4、保存灰度 |"<<endl;
cout<<"| 5、退出 |"<<endl;
cout<<"-------------------------------------------------------------------"<<endl;
cin>>ch;
cout<<"ch="<<ch<<endl;
switch(ch)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
k=false;
break;
default:
break;
}
}
}
...全文
295 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lijiao7073 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 enter333 的回复:]
LZ的问题我也遇见过,应该不是ls所说的输入前加类型检查就能解决的。
输入的类型如果是int,则在输入非数字的时候,就会死循环了。建议考虑输入类型为string或者char。然后再做相应的转换为int类型;我是这么操作的:

C/C++ code


void GetMonth() //从键盘输入获得月份
{
string s_month;
do
……
[/Quote]


嗯,谢谢啦。

我在C++primer plus 上看到说是,如果输入类型不一致,那么那些不一致的数据将一直留在缓冲区内,等待匹配的接收者。
想想也是,大概也正是因为这样所以才可以这样使用cin>>int>>string
和<<的重载应该还是有关系的。

不过还是谢谢你啦。
ypb362148418 2010-03-17
  • 打赏
  • 举报
回复
找一下<<运算符重载,或者转到定义,看看编译器是如何实现这些个的重载的
赵4老师 2010-03-17
  • 打赏
  • 举报
回复
摒弃cin和cout,使用scanf和printf.

记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”
zengtao360220 2010-03-17
  • 打赏
  • 举报
回复
额 这样 开始还不知道呢。!学习下子。。。。以前做一个小项目总是碰到这样的问题。。就是无法解决。
顶。。
cattycat 2010-03-17
  • 打赏
  • 举报
回复
或者把cin.clear()和cin.ignore()那两行加到switch的default后面,再加一句输入不合法的样子。
cattycat 2010-03-17
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

void main()
{
bool k=true;
int ch=0;
while(k)
{
cout<<"------------------------------------------------------------------|"<<endl;
cout<<"| 1、输入文件路径 2、计算灰度 |"<<endl;
cout<<"| 3、显示灰度 4、保存灰度 |"<<endl;
cout<<"| 5、退出 |"<<endl;
cout<<"-------------------------------------------------------------------"<<endl;
cin>>ch;
cout<<"ch="<<ch<<endl;
switch(ch)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
k=false;
break;
default:
break;
}
cin.clear(); //加上这两行会忽略非数字的输入,就不会死循环了。
cin.ignore();
}
}
r11222 2010-03-17
  • 打赏
  • 举报
回复
好!!!!!!!!!!!!!!!!!!!!!!!!!
enter333 2010-03-17
  • 打赏
  • 举报
回复
LZ的问题我也遇见过,应该不是ls所说的输入前加类型检查就能解决的。
输入的类型如果是int,则在输入非数字的时候,就会死循环了。建议考虑输入类型为string或者char。然后再做相应的转换为int类型;我是这么操作的:


void GetMonth() //从键盘输入获得月份
{
string s_month;
do
{
cout<<"Input the month:"<<endl;
cin>>s_month;
month = StrToNum(s_month);
}while (month < january || month > December);
}

int StrToNum(string &s) //字符串转数字
{
int Num;
stringstream ss(s);
ss>>Num;
return Num;
}


string NumTostr(int &i) //数字转字符串
{
stringstream ss;
ss<<i;
return ss.str();
}

barbara2008 2010-03-17
  • 打赏
  • 举报
回复
输入前加类型检查
关于重载
google c++ 重载

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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