| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 850 人关注过本帖
标题:关于 EOF 的问题,求解
只看楼主 加入收藏
c3242404
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2014-6-22
结帖率:100%
收藏
已结贴  问题点数:18 回复次数:12 
关于 EOF 的问题,求解
/*输入字符,判断是否为字母,是字母就报告该字母在字母表中的位置*/
#include <stdio.h>
#include <ctype.h>
int fun (char ch);
int main (void)
{
    char c;
   
    printf("请输入字符:\n");
    while(scanf("%c", &c) != EOF)
    {
        
        fun(c);
        if(fun(c) == 1)
            printf("%c是个字母,它在字母表中的位置是:%d\n", c, (int)c - 64);
        if(fun(c) == 2)
            printf("%c是个字母,它在字母表中的位置是:%d\n", c, (int)c - 96);
        if(fun(c) == -1)
            printf("%c不是一个字母。请输入字符:\n", c);
        scanf("%c", &c);
    }

    return 0;
}


int fun (char ch)
{
    if(isupper(ch))//大写
        return 1;        
    else if(islower(ch))//小写
        return 2;   
    else
        return -1;
}
ctrl+z不是在一行的开头输入就可以了吗?为什么我要输入两行才行?
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: include 字母表 
2014-06-27 13:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
你看看自己循环中调用了多少次scanf()再说啦

授人以渔,不授人以鱼。
2014-06-27 13:28
c3242404
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2014-6-22
收藏
得分:0 
回复 2 楼 TonyDeng
我把if(fun(c) == -1)后面的scanf语句删除后还是得输入两次ctrl+z,而且程序会把回车当成输入的字符,然后提示不是字母,请重新输入,就像下图所示的
图片附件: 游客没有浏览图片的权限,请 登录注册
2014-06-27 14:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实你写出scanf()==EOF这样的语句时,有没有查过这个函数的返回值是什么意思、它能返回EOF吗?在哪里看过有人这样写?我最感兴趣的这个错误用法为什么会如此流行,看过很多次了。

授人以渔,不授人以鱼。
2014-06-27 21:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
建议先把scanf()的用法琢磨透了再写,养成看《库函数参考手册》的良好习惯!

授人以渔,不授人以鱼。
2014-06-27 23:48
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
回复 4 楼 TonyDeng
因为,对于新手,首先接触到的输入函数一般就是scanf和getchar. 然后学到数组(字符串)才接触到gets. 因为字符串存储的特殊性,一般很少用gets.所以也就前两个比较常用了,

在新手教材中, 一般到函数相关章节才介绍函数的返回值的问题,而这一般都到教材的后半部分了.  所以老师也好,学生也好,在之前是不关心函数返回值的,而只关心函数的功能.

这两个函数都是用来输入字符的,对于函数getchar, 输入什么就得到什么. 以此类推,所以scanf也是输入什么就得到什么.

由于scanf在教材中频频出现,教材中又出现(c=getchar())!='\n';这样的代码, 所以就里很容易出现scanf("%c",&c)!='EOF'这样的代码了.

代码测试环境:  WinXP+C-Free5.0.
2014-06-28 09:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
正常而且聪明的人,当不知道某函数的返回值意味着什么的时候,就避免用,如果一定要用,至少要查阅过资料再用。如果scanf()函数返回值如getchar()那样,为什么后者不用参数而前者要?这不是在后面才学的问题,既然没学到,你都敢超前用了,何不超前看看书。若不是在网上乱看错误的代码示范,哪可能如此泛滥,正规的书上都不可能有这样的示例。

其实我也说过无数次,手边没搁着一本使用中语言的《库函数参考手册》,就不要动手写程序,不管是新手还是老手(再高级的老程序员也要这样)。那些为了省几百兆硬件空间而喜欢装简版环境、说开发环境太占用资源的人,都不是认真学习和工作的。

授人以渔,不授人以鱼。
2014-06-28 09:46
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 7 楼 TonyDeng
每次遇到运算符优先级的时候,我都要查一下

总有那身价贱的人给作业贴回复完整的代码
2014-06-28 09:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用embed_xuel在2014-6-28 09:52:36的发言:

每次遇到运算符优先级的时候,我都要查一下

呵呵,我是从不理会优先级的,代码必须强制按照我的意图执行,用括号、中间变量简化表达式,不纠缠在无把握的优先级上,否则现在很清楚,将来再看的时候也会不再清楚,给别人看也是麻烦惹人厌。

授人以渔,不授人以鱼。
2014-06-28 10:55
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 9 楼 TonyDeng
我也是在别人问题时,自己码时多加点括号,分几句写。

总有那身价贱的人给作业贴回复完整的代码
2014-06-28 11:05
快速回复:关于 EOF 的问题,求解
数据加载中...
 
   



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

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