| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5475 人关注过本帖
标题:怎么提示错误然后返回重新输入?
只看楼主 加入收藏
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
cin.get() 就是读一个字符。他的那个用法,是为了把缓冲区里的回车忽略掉。
2010-11-12 23:05
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
回复 11楼 pangding
11楼的大哥,我既然我在while()中使用cin.get(),那么cin.get()一定是返回了一个值,怎么可能像你说的那样是在缓存区中读取了回车呢?cin.get()返回一个bool类型的值,如果前面的cin在输入流中读取成功,那么就返回true;如果失败,就返回false。不过,你说的读取回车(术语应该是换行符),是在前面读取的是字符的时候才会用到,读取整型是不存在这种问题的。而且,是否在读取后,再多读取一个字符(换行符),这也要看是使用什么的编译器和IDE,我使用的是VC++2010,所以需要。
2010-11-13 01:24
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我也没太仔细看你为什么用 cin.get() ,但想来可能是我说的那个作用。如果说错了,大家就按他本人的意思来理解。

不过如果你只是想看看流的状态,一般应该是用 good() 或者 fail() 什么的。
get() 返回的是流本身,这里是因为套在 while 里,所以引发自动转换才有你说的效果的。不过,按你那么理解一般就够了,那个函数本来也是为那个目的设计的。

标准的 C++ 语言一般不用看编译环境,除了一些编译器提供特殊的功能,其它的地方符合标准的编译器应该都是一样的。
呵呵,不过看你挺注重概念的,基本功也相当扎实。值得大家学习~~
2010-11-13 20:58
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
哦,去查了查资料,呵呵,因为 get() 这函数我很少用。
有几种重载的形式:其中一个是 int_type get() 应该就是你用的那个,返回的还真不是个流,而是它从流里读的字符。其它的几种重载形式都是返回流的。


[ 本帖最后由 pangding 于 2010-11-13 21:23 编辑 ]
2010-11-13 21:11
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
    在此,我详细解释一下。
    cin.get(char)方法的返回值是一个cin对象。不过istream类提供了一个可以将istream对象(如cin)转换为bool值得函数。当cin出现在需要bool值得地方(如在while循环的测试条件中)时,该转换函数将被调用。另外,如果最后一次读取成功了,则转换得到的bool值为true;否则为false。这意味着可以while(cin.get(ch)){...}就可以解释为首先读取ch,如果ch读取成功了,进入循环体。而while(cin.get()){...}是说如果上次读取成功了,进入循环体。
    还有,你提到的C++语言不看编译环境,我想说的是,有人使用的编译环境中布尔类型是BOOL,有人使用的编译环境的布尔类型是bool,而这两种布尔类型所声明的变量大小也是不同的。你怎么说C++语言是不看编译环境的呢?还有如果是在Linux系统下编译C++,和在微软环境下编译C++这两者是有区别的。难道你还要一样对待吗?你提到的标准的编译器,哪我想问你,哪种编译器是标准的。你是想说C++标准吧?C++标准也是岁时间的变化在扩充和改变,你说的又是那种C++标准呢?这么多的不同,这么多的编译环境,你怎么能说编译和运行情况是一样的呢?
    我不敢说我是个编程高手,虽然我从初一就已经看是编程了,到现在已经10年了,学习了4种编程语言,其中包括汇编语言,但我还是认为我只是刚刚踏入编程的世界。但是,既然我们现在在学习编程,尤其是在帮助别人,帮别人解决学习过程中的困难,那么我们就应该对自己要求严格。否则不是在帮助别人,而是在误导别人。当然我发表过的帖子和说过的话中也有错的时候,但别人指出的时候,我会承认并改正。但我们要坚持的是不要一丝的马虎和差不多。
2010-11-13 23:14
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
如果说我的观点,学 C++ 应该就是学标准 C++ 学起,用什么编译环境无所谓的事。
如果环境和标准描述的想去甚远,就应该不用。要是从这个角度来看,BOOL 这东西就不应该用。C++ 标准应该说过,没有任何大写的关键字。至于你说的什么标准,我说什么标准都一样,标准都是向后兼容的,第一份出台的标准中的任何描述,在以后的标准中都会 生效。除非明确指出变化,但这种情况很少见。

对初学者来说,忽略编译器的区别是有一定现实意义的。因为他们很难区分什么是这个编译器(或库)扩展的,什么是普遍适用的。
有时言简意赅的解释对他们更有用。不过有些该扩展的地方我也会引导他们去学的,比如看你基础较好,我就多提示了一些东西。显然你之后去查阅资料,也学到了一些东西(当然你也可能是早就知道,反正我多提的东西也不一定只给你一个人看)。说误导我觉得不合适,我对我大部分的发言还是比较负责的。当然如果和比较熟的人也会调侃,閑扯几句。不过你追求严谨我觉得也没什么不好。

微软的东西一般都喜欢做各种扩展,一方面彰显技术,一方面提高移植的难度。当然也可能有其它用意。


我也学了不少编程语言,汇编自然也学过,不过我学的年头和您没法比。
编程的年头长了,就会养成各种各样的习惯。因为好多编程的文化呀,素养呀在您的意识里都很自然。如果你在 linux 下做项目做的久,或者对开源项目的贡献比较多的话,一般会更关注标准之类的东西。Windows 的文化和这些区别比较大,我也不是很了解。
虽然你很谦虚,不过实力肯定是不俗,以后能向您请教的问题多的是。我的技术很差的,您初到论坛不了解。以后就会慢慢熟悉了~~
2010-11-13 23:49
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
    你说,对初学者来说,忽略编译器的区别是有一定现实意义的。对此,我不反对。对于初学者来说,最重要的是让他们把尽可能多的精力放在算法上面,而不是哪种编译器上。如果过分地区别编译器的特性,那么会降低对算法的认知。但我说的是,在提出问题的时候附加上编译器的类型、所使用的操作系统,这样能够把问题说得更为清楚。有些问题,其实不是语言或是算法本身问题,而是编译器的不同造成的。这一点我在这几年的编程过程中深有体会,对于一年前编写的一部分代码,仅仅只是在编译环境的后续版本上编译,结果却差别很大,不得不重新对编译环境手册学习,然后重新修改程序。
    让初学者在学习编程初期就认识到这一点,不是没有好处,相反能够更为全面地认识问题本质。
    话又说回来,仅仅看看编译器是什么的、在描述问题的时候多输入几个字符又不会花费很大代价。但这样会给交流双方带来很大的方便,能够直接指出问题的所在。何乐而不为呢?
2010-11-14 00:06
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
嗯嗯,同意。学习写标准代码,就是为了避免同一个份代码在这编这样,在那编那样的结果。
不过话说回来,你说的编译器,向后兼容的工作做的也太差了,这一点确实很令人愤慨。
2010-11-14 00:17
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:0 
用do while语句
2010-11-15 08:46
快速回复:怎么提示错误然后返回重新输入?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043590 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved