标题:字符计数程序的问题
只看楼主
文若千寻
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-7-29
结帖率:100%
已结贴  问题点数:20 回复次数:8 
字符计数程序的问题
看书上的字符计数程序,自己也写了一个.如下:
# include <stdio.h>
int main(void)
{
    int i, c;
    i = 0;
    c = getchar();

    while(c != EOF){     
        ++i;
        c = getchar();
        printf("i=%d\n",i);  
    }
    return 0;
}

    运行后,我输入了"123"三个字符然后回车,出来的结果是i=1 i=2 i=3,按照这个程序,应该还有个i值为4,为什么没有显示出来
    然后我按了EOF的快捷键,显示了个 i=4的结果,为什么我输入的是EOF,printf程序还是把i=4显示出来了.
    真是百思不得其解啊!!

    另外我也写过
    printf("i=%d\n",i);
    c = getchar();
    }
    这个我推算的结果和输出的是一样的.现在我就是想知道 当c=getchar()在printf()前面的时候为什么会是这个结果?
搜索更多相关主题的帖子: return include 快捷键 
2015-07-29 13:06
kenierlee
Rank: 6Rank: 6
等 级:侠之大者
威 望:3
帖 子:58
专家分:474
注 册:2015-7-28
得分:20 
因为你第一次循环的时候实际上从控制台获取了2个字符之后才输出i的值,所以导致i少输出了1次。(注意进入循环之前的getchar())
当你输入EOF,循环里面的getchar()返回,把EOF赋值给c,然后printf(这时i=4),最后循环结束。
2015-07-29 13:23
文若千寻
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-7-29
得分:0 
回复 2楼 kenierlee
第一次我知道是取了2个字符,是在 c=getchar()这句取的第二个个字符吗么?
我算的经过是            循环 第一次    第二次    第三次        第四次   
    变量c在while条件句中的值    1        2        3            '换行符'

                        ++i     1        2        3              4

                变量c的新值     2        3        '换行符'        空的

            printf输出的i值     1        2        3              4

这结果应该是4啊

还有我输入EOF后c不是被赋为EOF了 这条件就不成立了 为什么还是执行了printf这句
2015-07-29 13:43
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
得分:0 
楼主可知输入EOF的方式
2015-07-29 13:45
文若千寻
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-7-29
得分:0 
回复 4楼 hjx1120
CTRL+Z 是这个吗
2015-07-29 13:48
kenierlee
Rank: 6Rank: 6
等 级:侠之大者
威 望:3
帖 子:58
专家分:474
注 册:2015-7-28
得分:0 
回复 3楼 文若千寻
...
c = getchar(); // c = '1'
...
// 第1次循环入口 c != EOF (成立,因为c='1',进入循环)
++i;                 // i = 1
c = getchar();       // c = '2'
printf("i=%d\n",i);  // 输出:“i = 1”
// 第2次循环入口 c != EOF (成立,因为c='2',进入循环)
++i;                 // i = 2
c = getchar();       // c = '3'
printf("i=%d\n",i);  // 输出:“i = 2”
// 第3次循环入口 c != EOF (成立,因为c='3',进入循环)
++i;                 // i = 3
c = getchar();       // c = '\n'
printf("i=%d\n",i);  // 输出:“i = 3”
// 第4次循环入口  c != EOF (成立,因为c='\n',进入循环)
++i;                 // i = 4
c = getchar();       // c = EOF // 注意,这里程序阻塞,等待你输入EOF
printf("i=%d\n",i);  // 输出:“i = 4”
// 第5次循环入口  c != EOF (不成立,因为c=EOF,循环退出)
...
return 0;
----------------------------------------------------------------------------------------------------------------
上面是整个循环的代码执行流程,你自己分析吧。

[ 本帖最后由 kenierlee 于 2015-7-29 14:00 编辑 ]
2015-07-29 13:59
文若千寻
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-7-29
得分:0 
回复 6楼 kenierlee
谢谢你的分析
现在我的问题是就是
// 第4次循环入口  c != EOF (成立,因为c='\n',进入循环)
 ++i;                 // i = 4
 c = getchar();       // c = EOF // 注意,这里程序阻塞,等待你输入EOF
 printf("i=%d\n",i);  // 输出:“i = 4”
// 第5次循环入口  c != EOF (不成立,因为c=EOF,循环退出)
 ...
return 0;
\
这第四次循环
我只能估计 c = getchar();       // c = EOF // 注意,这里程序阻塞,等待你输入EOF

是这一步对变量c赋不了值,所以后面的输出变量i也不会执行,而且

这次循环里的 ++i;                 // i = 4
也不会被执行,
因为后面我不输入EOF,改成输正常的数字比如12
再按回车执行 结果完全正确
如果在第四次循环中 i的新值被保留了应该是567吧.
但是结果是4  5  6

那是不是就是说 如果第四次循环中 c = getchar();  变量c取不了值,那么前面的++i 新值不存储和后面的printf也不会执行.
不知道我猜的原因是不是对的,我就是个新手,可能编的时候 写错顺序了,所以一直纠结这个问题,想弄懂,别鄙视......

再次谢谢你的帮助!!
2015-07-29 14:33
w15808106137
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-7-29
得分:0 
受教了
2015-07-29 20:49
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
得分:0 
打印出i=4 是因为c=getchar()得到了你输入的回车
2015-07-30 16:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-455892-1-1.html




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

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