田安Anne

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
这个是单词计数
有点难理解,不是说结构多难,而是这本书其实也没阐明这个程序的功能
再加上是翻译过来的,刚开始看还是会蒙逼的
 
阐述下整个逻辑:
共有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  阅读(396)  评论(0编辑  收藏  举报