首页
社区
课程
招聘
C程序设计语言发现的一个问题 求解答
发表于: 2012-6-24 16:12 10877

C程序设计语言发现的一个问题 求解答

2012-6-24 16:12
10877
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main(void)
{
    int c;
    long nc=0;
    c=getchar();
 
    while(c != EOF)
    {
        nc++;
        printf("%ld\n",nc);
    }
     
     
    return 0;
}


上面是《c程序设计语言》中第1.5.2 小节的一个计算输入字符长度练习题  为什么我运行的时候while循环是不停止的  也就是在字符结束的时候 c!=EOF 并不成立
但是
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(void)
{
    int c;
    c=getchar();
    while((c=getchar())!=EOF
    {
        putchar(c);
    }
    return 0;
}

这样写 运行结果是正确的

EOF //文件结束的标志  为什么在上面的第二个程序 里面是可以检测到字符串结束 但是第一个就检测不到呢?

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费
支持
分享
最新回复 (17)
雪    币: 42
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
唔 第一个程序貌似只获取了一次输入吧

1
c = getchar();

放到while循环体里应该就可以了
唔,应该是在while循环体里添加这条语句合适一些~
2012-6-24 16:50
0
雪    币: 93
活跃值: (483)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
EOF是文件结束的吧,判断字符串结束应该是 c!='\0'
2012-6-24 18:19
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=LShang;1082390]唔 第一个程序貌似只获取了一次输入吧

1
c = getchar();

放到while循环体里应该就可以了
唔,应该是在while循环体里添加这条语句合适一些~[/QUOTE]
哦 我放里面以后 是可以结束 但是我这样写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main(void)
{
    int c;
    long nc=0;
     
    while(c != EOF)
    {
        c=getchar();
        nc++;
    }
    printf("%ld\n",nc);
     
    return 0;
}

把printf 拿到外面就无法输出nc 的值呢?
2012-6-24 18:35
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
嗯 但是 从第二个程序可以看出了EOF 也是可以结束 为什么第一个就无法结束呢?  难道书上是错的?
2012-6-24 18:36
0
雪    币: 42
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这段代码逻辑上没有问题
而且应该可以正常运行的
唯一的问题就是在变量c使用之前没有对其进行初始化
可以在声明时赋值为0
另外我测试了一下,没遇到你说的问题
printf语句是可以正常执行的
请问你确定正确的键入了EOF?
2012-6-24 18:43
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
嗯 是的 我运行 回车后是可以继续输入的 没有输出个数 我用的win7+VC++6.0
然后我发现这样是可以运行的
1
2
3
4
5
6
7
8
9
10
11
int main(void)
{
    long nc=0;
 
    while(getchar() != '\n')
    ++nc;
    printf("%ld\n",nc);
     
     
    return 0;
}

难道getchar() 在回车后 并没有认为程序 结束?
2012-6-24 18:53
0
雪    币: 42
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Windows下EOF的正确键入方式是ctrl + Z
程序本身没啥问题的
2012-6-24 19:01
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢 楼上两位的帮忙 万分感谢 经过我测试是这样的
代码

#include <stdio.h>
int main(void)
{
long nc=0;
int c;
while((c=getchar())!=EOF)
{
putchar(c);
nc++;
printf("%ld\n",nc);
}

return 0;
}

输出的结果为:

可以看出 回车符 也会被计算在内 也就是认为 没有结束  而在执行一次getchar();  故 外面的printf 就不会被执行  而换成'\n'  就能遇到回车后跳出while 循环 而EOF 会认为回车后面才是结束标志
2012-6-24 19:11
0
雪    币: 42
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int main(void)
{
    int c,nc;
 
    nc = 0;
    while ((c = getchar()) != EOF)
    {
        ++nc;
    }
 
    printf("%d",nc);
 
    return 0;
}
上传的附件:
2012-6-24 19:56
0
雪    币: 42
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
唔 纠正错误
这段代码有逻辑错误的
在接受到EOF之后,nc还会再自增一次
这样会把EOF也算为字数中
2012-6-24 19:59
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
嗯 多谢了  ctrl + z 我才知道 
2012-6-24 20:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这段代码有点问题,11楼已经说了,当时我也很疑惑
2012-7-20 10:18
0
雪    币: 194
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
貌似上学时接触过 看了楼下各位解释  感觉还要加强学习
2012-8-9 21:52
0
雪    币: 3496
活跃值: (749)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习了,回头试试下。
2013-11-21 12:28
0
雪    币: 713
活跃值: (662)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
“Windows下EOF的正确键入方式是ctrl + Z” 学习了~
2013-11-28 22:54
0
雪    币: 168
活跃值: (823)
能力值: ( LV10,RANK:173 )
在线值:
发帖
回帖
粉丝
17
EOF的全称是ending of file,个人认为这边主要是为了从文件中去读,而不是从控制台去输的。
还有,我觉得如果是第一次接触C,不建议用K&R的书(书是非常经典的,但未必能看好)。
2013-11-29 17:27
0
雪    币: 272
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
c= getchar()和EOF的判断放在while里。
2013-11-29 20:36
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册