1
#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 换了这么多其他选择,但仍然得到相同的结果,这是为什么呢?如果这是一个愚蠢的问题,请提前道歉,因为我自己是一个愚蠢的编码员。保重并感谢您的宝贵时间!

4

2 回答 2

1

上一点:

在 C 中,如果条件表达式为 false,则为0true,如果为任何其他值,则为 true,因此YES可以为1, 1000,-1000等,只要它不是0对其进行评估的条件表达式将始终为 true。

至于问题:

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

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

If YESis 0,tab将永远是0并且NW不会是准确的,因为它将计算所有字符,除非它们是\t 或者\n这不是程序应该做的,NW应该是单词的数量。

例如,对于这个输入:

This is a word I wrote

你将拥有:

NL: 1
NC: 23
NW: 17 

什么时候应该:

NL: 1
NC: 23
NW: 6

设置tab1( YES) 作为一个标志,表示该段代码仅增加nw1 次,以防这三个字符之一,从而仅计算单词或换行符之间的空格一次,为您提供中的单词数输入的文本。

于 2021-02-10T17:28:47.410 回答
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);
}
于 2021-02-10T17:24:25.500 回答