解决scanf或者cin造成的死循环问题
2014-08-06 00:13
246 查看
问题明确了,答案也就出来了,显然是因为scanf函数或者cin读取输入字符时的问题,我用C写了小程序来演示这个问题,代码如下:
那怎么解决呢?也很简单,只要在for循环内部调用scanf函数前添加一句fflush(stdin)来强制刷新输入缓冲区就可以了,这样输入缓冲区里就又是空的了,所以scanf会等待用户输入。
感谢键盘农夫在评论中指出了一个影响可移植性的问题:fflush(stdin)是未定义行为。查看了一下ISO9899.1999发现确实是这样的,从MSDN的介绍来看VC是完全支持这种做法的,其它编译器就不好说了,于是我找了另一个清空输入缓冲区的方法Flush
the input buffer,但是这个方法在这里使用的话或许会影响代码可读性,可以自己创建一个FlushStdinBuffer函数完成这件工作。本段是May/06/2011新加内容。
还可以怎么解决呢?我的同学提出了一个方法,就是将number不定义成int型,而是char型,那么到底行不行呢?乍一看上去似乎是可以的,但是如果用户输入是1287dst呢?程序将会只读第一个字符'1',然后认为这是合法的输入,这显然也是有问题的。
那么不使用scanf函数,然后用getchar函数呢?还是有些问题,因为如果用户输入是一个字符的话,getchar将会读取两次,第一次读到的是对应字符的ASCII码,第二次读到的是那个换行符0x0A,所以错误提示信息也会出现两次。getc函数也会引起同样的结果,所以如果一定想用这两个函数的话,就要自己在for循环内部过滤掉对0x0A的判断。那么getch呢?这个函数显然是可以的,因为这个函数虽然也跟前面两个函数一样读输入,但是它不需要用户按回车就可以读取,所以只会读到用户输入的那一个字符,只是不回显罢了。
显然,上面我们只提到了读取一个字符的函数,并没有提到gets之类的读取字符串的函数,因为这个小程序只允许输入字符,不过如果是其它程序需要这样做的话,gets是完全可以完成这个要求的,而且不会出现上面这么多问题,但是可一定不要忘记了缓冲区溢出哦。
而C++用std::cin读取整型数字的时候也会出现scanf函数的问题,当输入不是整数时,它也是直接返回,下次就死循环了,所以在调用cin前可以先调用cin.clear()和cin.sync(),单独调用一个是没有用的哦,你或许会疑惑这是为什么呢?
其实cin.clear()的作用并不像它的名字一样,当程序想要去读一个int型却读到了一个char型输入的时候,cin就会将自己的内部错误标识符设定为ios::failbit(没有错误是ios::goodbit),cin.clear()的作用不是清空输入缓冲区,而是清空这个内部错误标识符,真正清空输入缓冲区的是cin.sync(),但是只清空缓冲区也不行,因为内部错误标识符还保留着呢,下次读取的时候一看上次有错误,这次根本不读了……所以一定要一起调用。
好了,关于这个问题就谈到这里了,如果你也有同样的问题依旧没有解决的话欢迎留言,我们一起讨论学习。
相关文章推荐
- 解决scanf或者cin造成的死循环问题
- 解决hibernate双向关系造成的一方重复执行SQl,或者死循环的问题
- scanf和cin输入类型不匹配时造成的死循环问题
- 解决问题: Ubuntu装Caffe出现无法登陆图形界面或者循环登陆(Loop Login)
- 解决int型变量cin输入字符无限循环问题
- 解决mac下sublime text 2 无法读取cin,scanf的问题
- 解决json序列化有多对一和多对多关系的对象时造成死循环的问题
- tomcat启动时,不带项目名,启动两次或者造成端口冲突问题解决
- 问题:在程序中保存数据到索引库,发生异常jackson数据转换异常,造成死循环栈溢出 解决@JsonIgnore注解
- 解决cin因为输入错误的数据类型进入死循环的问题
- 解决c语言中调用scanf()或者strcpy()函数报错问题
- 解决mac下sublime text 2 无法读取cin,scanf的问题
- Ubuntu 16.04 一直卡在开机界面或者用户登录界面死循环问题的解决
- 用JavaScript解决ASP.NET服务器控件造成的刷新问题
- 解决刷新页面造成的数据重复提交问题
- SubmitOncePage:解决刷新页面造成的数据重复提交问题
- 用JavaScript解决ASP.NET服务器控件造成的刷新问题
- 前一问题造成自己的中间件不能调用,问题也解决
- [学习笔记][ASP.NET2.0][点击asp:Button出现两次提交数据的问题][解决:去掉OnClick或者OnCommand属性]
- 解决DEPEND ON关系的循环问题