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

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

2012-6-24 16:12
10822
#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 并不成立
但是
#include <stdio.h>
int main(void)
{
	int c;
	c=getchar();
	while((c=getchar())!=EOF
	{
		putchar(c);
	}
	return 0;
}

这样写 运行结果是正确的

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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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

c = getchar();

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

c = getchar();

放到while循环体里应该就可以了
唔,应该是在while循环体里添加这条语句合适一些~[/QUOTE]
哦 我放里面以后 是可以结束 但是我这样写
#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
然后我发现这样是可以运行的
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
#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
雪    币: 704
活跃值: (657)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回
//