C编程;字数、字符数和行数 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",nw);
}

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

解决方法

上一点:

在 C 中,如果条件表达式为 0,则计算结果为 false,如果为任何其他值,则为 true,因此 YES 可以为 11000、{ {1}} 等,只要它不是 -1000 条件表达式就始终为真。

至于问题:

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

0

如果 else if (tab == NO) { tab = YES; ++nw; } YES0 将始终为 tab0 将不准确,因为它会计算所有字符,除非它们是NW\t 这不是程序应该做的,\n 应该是字数。

例如,对于这个输入:

NW

您将拥有:

This is a word I wrote

什么时候应该:

NL: 1
NC: 23
NW: 17 

NL: 1 NC: 23 NW: 6 设置为 tab (1) 作为一个标志,通知该段代码只增加 YES 1 次,以防出现这三个中的一个字符因此计算单词之间的空格或换行符仅一次,从而为您提供输入文本中的单词数。

,

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

#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",nw);
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...