C编程;字数、字符数和行数 K&R 1-11

C Programming; Word, Character and Line Count K&R 1-11

#include <stdio.h>
#define YES 0
#define NO 0

int main()
{
    int c, nl, nc, nw, tab;

    nl = 0;
    nc = 0;
    nw = 0;

    tab = NO;
    while ((c = getchar()) != EOF)
    {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\t' || c == '\n')
            tab = NO;
        else if (tab == NO) 
        {
            tab = YES;
            ++nw;
        }
    }
    printf("NL: %d\nNC: %d\nNW: %d\n", nl, nc, nw);
}

大家好,这里是新程序员。实际上,非常新,我几天前才开始,希望扩大我的工作机会。无论如何,使用这个程序,它会计算每一个新行、单词和字符。在大多数情况下,我明白发生了什么,但我不明白的是新词部分。例如,在我们#define YES/NO 的顶部,单词前面的数字显然无关紧要?我将 1 和 0 换成很多其他选择,但仍然得到相同的结果,这是为什么?如果这是一个愚蠢的问题,请提前道歉,因为我自己是一个愚蠢的编码员。保重,感谢您的宝贵时间!

欢迎来到这个世界!你不需要它。我认为这应该是正确的方式(我很抱歉我的英语和我糟糕的解释):

#include <stdio.h>
int main()
{
    int c, nl, nc, nw;

    nl = 0;
    nc = 0;
    nw = 0;

    while ((c = getchar()) != EOF)
    {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c != ' ' && c != '\t' && c != '\n')
            ++nw;
    }
    printf("NL: %d\nNC: %d\nNW: %d\n", nl, nc, nw);
}

前一点:

在 C 中,如果条件表达式为 0,则条件表达式的计算结果为假,如果为任何其他值,则条件表达式的计算结果为真,因此 YES 可以是 11000 , -1000, 等等, 只要它不是 0 被评估的条件表达式将永远为真.

至于问题:

要使代码按预期工作,YES 必须是 1,或者,根据上面的解释,不是 0

else if (tab == NO) 
{
    tab = YES;
    ++nw;
}

如果 YES0tab 将始终是 0NW 将不准确,因为它将计算所有字符,除非它们是 \t \n 这不是程序应该做的,NW 应该是字数。

例如,对于此输入:

This is a word I wrote

你将拥有:

NL: 1
NC: 23
NW: 17 

什么时候应该是:

NL: 1
NC: 23
NW: 6

tab 设置为 1 (YES) 作为一个标志,表示该段代码仅递增 nw 1 次,以防出现以下情况之一这三个字符因此只计算单词或换行符之间的空格一次,给你输入文本中的单词数。