在以下脚本中需要使用IN和OUT状态?

时间:2014-05-12 13:02:19

标签: c string io getchar

大家好,我刚开始通过编程语言第二版学习C语言 布莱恩W.Kernighnan(ISBN-13:978-8131704943)

所以这是一个对字符,行,单词进行计数的脚本

#include <stdio.h>

#define IN  1
#define OUT 0

main()
{
    int c, nl, nw, nc, state; 
    /* c = input, nl = new line, nc = new character, nw = new word, state = (IN/OUT) */
    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(" The number of lines is: %d,\n The number of words is: %d,\n The number of characters is: %d. \n", nl, nw, nc);
}

然而,我制作了一个脚本,无需定义状态IN和OUT

即可执行以下操作
#include <stdio.h>
main()
{
    int nw, nl, nc, c ;
    nl = nw = nc = c = 0 ;
    while ((c = getchar()) != EOF)
    {
        ++nc;
        if (c == '\n')
            ++nl;
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nw;
    }
    printf("Words:%d \nCharacters:%d \nLines:%d", nw, nc, nl);
}

那么这两者之间有什么区别,为什么作者使用状态来定义IN和OUT ??

[编辑] 哦!我看到脚本只是为了避免两件事: 1.当单词后面有多个空格时,避免字数统计。 其次,如果适当的间距,我的脚本会计算n-2个字。 这使得作者的脚本更加全面.....除了这两个之外还有什么其他的吗?

谢谢你的回答......

P.S:对不起,这有点偏离主题,可以标记问题[已解决]还是有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

IN字面意思是“在一个词内”而OUT字面意思是“在一个词之外”。他正在通过线条跟踪状态光标的状态。

答案 1 :(得分:2)

您的版本与他的版本略有不同:在您的程序中,如果您有N个连续的空格,它们将被视为N - 1个单词,因为对于每个空格,您都会在单词计数中添加一个空格。此外,最后一个输入词不会被考虑。