单词计数

这个是单词计数
有点难理解,不是说结构多难,而是这本书其实也没阐明这个程序的功能
再加上是翻译过来的,刚开始看还是会蒙逼的
 
阐述下整个逻辑:
共有5个变量,c是我们输入的字符,nl代表\n的个数,nw代表单词数,nc表示字母数
所谓的IN 和 OUT就是一个种状态,有点类似于标志寄存器
我们首先,给定的状态state = OUT,即初始状态是在单词外的,接着nl nw nc 的初始值也都是0
nl = nw = nc = 0相当于 nl = (nw = (nc = 0))
现在开始循环体的执行,循环的条件不说了,上次说过
我们令c = getchar() = 'abc'
其实是分别循环了'a'  'b' 'c'  '\n'(这个我也是在OD的时候发现的,刚开始学汇编只是无聊,但发现这玩意有时还挺有用)
很明显经过++nc 后,nc = 4
我们一个个分析,首先是'a':执行的是 else if (state == OUT)循环体的内容,nw = 1,但此时state = IN了
                              接着是'b':不执行啥
               接着是'c':不执行啥
                              接着是'\n':执行的是if (c == '\n') 循环体的内容,nl = 1
 
所以结果可能是 nl = 1, nw = 1,nc = 4
我们来看看结果,bingo,正确的
                                            
#define IN 1 //在单词内       
#define OUT 0 //在单词外
 
int main()
{
 
       int c, nl, nw, nc, state; //nl表示单纯换行数,nw表示单词数,nc表示字符数
 
       state = OUT;
       nl = nw = nc = 0;
       while ((c = getchar()) != EOF)
       {
              ++nc;
              if (c == '\n')
                      ++nl;
              if (c == ' ' || c == '\n' || c == '\t')
                      state = OUT;
              else if (state == OUT)
                      {
                             state = IN;
                             ++nw;
                      }
       }
       printf("nl = %d , nw = %d , nc = %d\n", nl, nw, nc);
       system("pause");
       return 0;
}
 
演示一遍:
我们输入了两个单词,nw = 2,自然getchar吸收了两个\n,nl  = 2 ,
一共有6个字母,由于getchar会吸收两个\n,nc = 6 + 2 = 8

 

posted on 2018-08-07 09:42  田安Anne 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/EvilAnne/p/9435201.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值