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: %dnNC: %dnNW: %dn", nl, nc, nw);
}

嘿,伙计们,这里是新的编码员。事实上,我是新来的,我几天前才开始工作,希望能拓宽我的工作机会。不管怎样,有了这个程序,它会计算每一行、每一个单词和每一个字符。在很大程度上,我明白发生了什么,但我不明白的是新词的部分。例如,在我们#define YES/NO的顶部,单词前面的数字显然无关紧要。我把1和0换成了很多其他的选项,但仍然得到相同的结果,这是为什么?如果这是一个愚蠢的问题,提前道歉,因为我自己就是一个愚蠢的程序员。保重,谢谢你的时间!

前一点:

在C中,如果是0,条件表达式将计算为假,如果是任何其他值,则计算为真,因此YES可以是1,1000,-1000等,只要不是0,则计算的条件表达式将始终为真。

对于问题:

为了使代码正常工作,YES必须是1,或者,根据上面的解释,不是0

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

如果YES0,tab将永远是0,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)作为标志,表示如果存在这三个字符之一,则该代码只增加nw1次,从而计算单词之间的空格或换行字符仅一次,给出输入文本中的单词数。

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

#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: %dnNC: %dnNW: %dn", nl, nc, nw);
}

相关内容

  • 没有找到相关文章

最新更新