C++中有关cin的一个问题?

Eric_Davis 2003-09-29 06:50:29
我在做一个练习时有这么一个代码段:
……
enum Choices { TEXTFILE = 1, UPDATE, NEW, DELETE, END };
int choice;

while ( ( choice = enterChoice() ) != END ) {

switch ( choice ) {
……
其中enterChoice()函数如下
int enterChoice()
{
cout << "\nEnter your choice" << endl
<< "1 - store a formatted text file of accounts\n"
<< " called \"print.txt\" for printing\n"
<< "2 - update an account\n"
<< "3 - add a new account\n"
<< "4 - delete an account\n"
<< "5 - end program\n? ";

int menuChoice;
cin >> menuChoice;
return menuChoice;
}
程序可以编译,运行。
当提示输入时,我输入数字,程序正常运行,但是我输入了字母就进入无限循环。想了半天不知道问题究竟是怎么了。估计是
int menuChoice;
cin >> menuChoice;
return menuChoice;
这里有点问题,应该输入int型但输入了字符型。请问如何解决这个问题呢?
...全文
49 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eric_Davis 2003-10-07
  • 打赏
  • 举报
回复
cin.clear();
cin.ignore(-1);
cin >> menuChoice;
这么做还是不可以。我想知道,cin在得到一个类型不匹配的输入时会怎么样?我觉得这是问题的关键,就算使用字符,避免这样的错误。但是我想了解的透彻点。有能回答的吗?
Eric_Davis 2003-10-06
  • 打赏
  • 举报
回复
对不起,defual我写了但是没有在这里列出来。我程序里的defual是输出指令错误的信息。
我会再测试一下大家的建议,然后跟踪一下程序。如果解决了问题立刻给分,谢谢大家的帮助。
dcrmonkeys 2003-10-06
  • 打赏
  • 举报
回复
你怎么没有defual?
Wolf0403 2003-10-06
  • 打赏
  • 举报
回复
记得 MSDN 上提供的例子就是直接
cin.clear();
cin.ignore();
的,而且偶测试通过过。
除非偶记错^_^
短歌如风 2003-10-06
  • 打赏
  • 举报
回复

输入字母并不会返回它的ASCII码,而是会得到一个随机值,并且不会把这个字母从缓冲区中清除,因此下次读的还是这个字母——死循环。

因此方法就是用ignore把缓冲区清空,要求只接收你显示提示信息后的输入。如果不行,可能是因为上次错误输入时导致流的错误状态被置位了,再加一句clear试试:

cin.clear();
cin.ignore(-1);
cin >> menuChoice;

如果还不行,可能你只有改为输入字符而不是数字了。
tianjieshui 2003-10-05
  • 打赏
  • 举报
回复
这个输入字母本来就是个死循环,输入字母返回的是ASCII码,不在你所定义的枚举类型中。也就是说永远符合你的循环条件、你如果输入一个大一点的整数
我想也会死循环
htlz 2003-10-05
  • 打赏
  • 举报
回复

再查查它的逻辑关系,看看程序是否严谨,慢慢跟踪,可能会发现些什么
Eric_Davis 2003-10-05
  • 打赏
  • 举报
回复
好象还是不行哦,仍然死循环。在switch操作中我提供了break处理错误的输入。
我看了循环内容,是enterChoice()在不断的循环运行。本来运行enterChoice()函数时应该提示输入,但看循环内容似乎没这么做。但我输入错误的数字时却可以正确发现错误并且正确的要求输入。
为什么是字符就会死循环呢?
lyr311 2003-09-29
  • 打赏
  • 举报
回复
UP!
playboyxp 2003-09-29
  • 打赏
  • 举报
回复
输入一个字母就是它的ascii码
导致死循环
短歌如风 2003-09-29
  • 打赏
  • 举报
回复
规范的写法好象是:
cin.ignore(numeric_limits<streamsize>::max());//需要#include <limits>
不过在某些编译器提供的STL代码中工作不正常,所以我一般都直接用-1。
短歌如风 2003-09-29
  • 打赏
  • 举报
回复
输入前加一句:
cin.ignore(-1);
cin >> menuChoice;

xueweizhong 2003-09-29
  • 打赏
  • 举报
回复
试试看这个:

...
int menuChoice;
if (
cin >> menuChoice &&
menuChoice >= TEXTFILE &&
menuChoice <= END
)
return menuChoice;
else
return END;
...

64,282

社区成员

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

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