| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1763 人关注过本帖
标题:新手请教,关于使用scanf返回值的几点问题
只看楼主 加入收藏
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
新手请教,关于使用scanf返回值的几点问题
本人想做一个scanf输入检查,输入的为4位整数(例如先锁定号码为8987),代码大致如下:
int a = 0;
scanf ("%d",&a);
while (a != 8987){
    printf("输入有误,请重新输入:");
    scanf("%d",&a);
}
printf("pass");

但问题来了,当我输入字符的时候,竟然while死循环了,不断打印printf而scanf却不起效。
第二点,如果我想让代码检查输入的一定为整数(不能为字符),并且必须为8987,我的代码该怎么改?
第三点,本人尝试返回scanf的返回值,当没接收则0,有接收一个数据则1,而我的疑问是EOF的情况是如何发生,并且可否打印屏幕显示出来?
请各位指教。
搜索更多相关主题的帖子: 如何 
2015-03-03 11:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
你能想出這3點,説明是有思考的,方向也對路。但問題是被EOF誤導了,解決這個問題的關鍵的確是檢測scanf()的返回值,但不是用EOF(我一直說在這些地方用EOF是錯誤的用法),并且,要用到非標功能(函數),即想辦法清空輸入緩存,否則那個字符數據始終賴在那裏讓scanf()獲取。

注意:當scanf()試圖轉換數據失敗的時候,它的動作是放棄讀取數據,也就是它無法處理的數據會成攔路虎,如果你不想辦法把那些不需要的數據用需要它的scanf()讀掉,就會一直讓你的後續scanf()去讀這些無法處理的非法數據,這就是死循環的原因。

控制臺上的人機交互,不要用EOF,也不要用按諸如Ctrl+Z、Ctrl+D之類的辦法製造EOF,那是異常行爲。

授人以渔,不授人以鱼。
2015-03-03 11:32
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 2楼 TonyDeng
谢谢指教,例子的用法都是学网上的,以我的做法可能这样做 while (scanf("%d",&a) == 1),但还弄不明白while (scanf("%d",&a) != EOF)里面EOF的含义, (当然按照你说的这样做是不对的要避免)以至于我尝试printf它的原因,但结果是0,1。

2015-03-03 12:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
看資料吧:
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


图片附件: 游客没有浏览图片的权限,请 登录注册



[ 本帖最后由 TonyDeng 于 2015-3-3 12:49 编辑 ]

授人以渔,不授人以鱼。
2015-03-03 12:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你衹要這樣用:對scanf("%d", &x),衹要函數的返回值不是1,就表明讀取不成功,不管是任何原因,此時需要清空輸入緩存再重複操作。不要理會EOF的返回值,返回這個值的情形不可預測,那與用戶的操作(在前面按Ctrl+Z或在後面按,效果是不一樣的,你無法假設在什麽時候會遇到)或設備的良好情況有關,屬於出錯情形。但輸入的數據不符合預設數據類型(即不能轉換),卻不屬於出錯!無論如何,衹有函數的返回值是1,才是你需要的——格式指示符中有幾個%項,就應返回幾。

授人以渔,不授人以鱼。
2015-03-03 12:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
scanf()類函數是C函數庫中最不可控制的,在程序設計中,不要用scanf()做人機交互界面,這是我一向的忠告。scanf()衹適用於靜態的數據掃描,即用fscanf()對已經定型在文本文件中的數據,它是高效有用的,但對動態、隨機可變的人機交互情形,它會讓你、程序以及用戶均崩潰。

授人以渔,不授人以鱼。
2015-03-03 13:04
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 5楼 TonyDeng
资料看完后大致清楚,谢谢你的帮助。
2015-03-03 13:14
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 6楼 TonyDeng
学习了,但因本人自学中,在学习资料里或在复习习题中都经常用到输入输出去讲解与编程,此次问题也为其中一题的内容,只不过并无要求太高程序的健壮性(例如输入的类型要求)
2015-03-03 13:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
自己用,就不需要這種檢測咯。你這個測試和代碼,本來就是爲容錯而做的。

授人以渔,不授人以鱼。
2015-03-03 13:29
快速回复:新手请教,关于使用scanf返回值的几点问题
数据加载中...
 
   



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

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