| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 13788 人关注过本帖
标题:scanf和cin如何判断输入结束呢,O(∩_∩)O谢谢
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
while(scanf("%d %d",&a, &b) != EOF)

对这个条件,scanf()是在不能成功读入两个整形数据时返回EOF,你在这个期间向其中任意一个数据灌入Ctrl+Z,就能让这个数读取失败,触发错误,函数会结束返回EOF。scanf()函数的返回值,是它能够成功处理的数据个数,你这里要读2个数据,那么它可能成功1个或2个,则会返回1或2,但若出错就会返回EOF(-1)。一般地说,用scanf()!=2来作条件,比==EOF合适,因为读数出错的可能性有许多,比如试图读整数但输入的是无法解释成整数的字符串,解释失败,但却不会返回EOF,它只有在遇到特殊的数据时才会返回那个,所以不要检测那个东西。

用返回值来标志错误的做法,是远古时代参照汇编的思想,已经过时了,现在是直接返回错误码的,不应再使用错误数据来标识出错,因为把数据和错误码混淆在一起是不合理的。这是C语言的经典问题,《C陷阱》中就讲到这个,典型如getchar()就是误导性的,标明是char,却居然有-1这种不可能是char的数据返回,逻辑上就说不通,这还好辩护,但问题是有人经常用定义为unsigned char的变量来接收这个函数的返回值,却永远得不到EOF,那是害死人了。

[ 本帖最后由 TonyDeng 于 2013-4-14 01:04 编辑 ]

授人以渔,不授人以鱼。
2013-04-14 00:53
如蜗牛
Rank: 2
等 级:论坛游民
威 望:1
帖 子:40
专家分:42
注 册:2013-4-12
收藏
得分:0 
回复 9楼 TonyDeng
或许,我该简化一下我的问题:如何使这个循环结束,不设定特殊的结束符的前提下。
2013-04-14 01:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
仔细看11楼,就会找到方法。换句话说,除了程序怎么写,还牵涉实际的外部数据是怎样输入的问题。

btw: 最好避免在一个scanf()中读入1个以上的数据,原因自己思考一下。

授人以渔,不授人以鱼。
2013-04-14 08:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

授人以渔,不授人以鱼。
2013-04-14 16:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

授人以渔,不授人以鱼。
2013-04-14 16:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你留意一下我的两次输入测试,与代码对比看看。

授人以渔,不授人以鱼。
2013-04-14 16:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

授人以渔,不授人以鱼。
2013-04-14 16:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
15楼和17楼,分别输入一个非法数据(另一个合法),位置不同,用这个方法都能检测出来,但对这种情况,存在一个问题是代码其实不知道到底是哪个数据错了,后续的修正工作就不好弄。因此,scanf()最好每次只读取一个数据,马上进行检查,及时纠正和处理,这是用于调试和排错的手段,并非说一个语句读10个数就很高效,到程序投入使用实际运行时出现错误数据你摸不准到底是哪个数造成的时候,就知道那种做法是因小失大。

授人以渔,不授人以鱼。
2013-04-14 16:28
如蜗牛
Rank: 2
等 级:论坛游民
威 望:1
帖 子:40
专家分:42
注 册:2013-4-12
收藏
得分:0 
回复 17楼 TonyDeng
衷心感谢您这么细致的讲解!!!

我刚才实验了一下,正如你说的,scanf();会有三种返回值,-1,1,2
(ctrl+Z)/x  4  返回为-1(EOF);【一个数据也没有正确读入】
4   crtl+Z/x   返回值为1;【正确读入一个数据】
1 2            返回值为2;【两个数据均正确读入】

此外,你说到直接返回错误码,不太理解,怎样呢?
2013-04-14 16:48
如蜗牛
Rank: 2
等 级:论坛游民
威 望:1
帖 子:40
专家分:42
注 册:2013-4-12
收藏
得分:0 
回复 18楼 TonyDeng
此外,您说到,关于数据输入的问题,一个scanf();一次最好读入一个数据。

是因为什么呢?

是因为我的两次输入数据都会产生回车键吗?所以结束时缓存中第一个数据产生的回车键会对第二个数据可能有影响吗?这里有一个问题不清楚,我在输入scanf时,回车键是什么时候,如何产生的呢?
2013-04-14 16:57
快速回复:scanf和cin如何判断输入结束呢,O(∩_∩)O谢谢
数据加载中...
 
   



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

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