测试空白时,C字计数程序失败

时间:2016-09-25 21:25:31

标签: c

我创建了一个简单的单词计数程序(“单词”:不包含空格字符的字符序列)。我的想法是在程序获得一个字符ch时计算一个单词,使ch不是空白字符,但ch之前的字符,称之为pre_ch是一个空白角色。

以下计划效果不佳(nw仍然停留在0):

/* Program to count the number of words in a text stream */

#include <stdio.h>

main()
{
  int ch;                       /* The current character */
  int pre_ch = ' ';             /* The previous character */
  int nw = 0;                   /* Number of words */

  printf("Enter some text.\n");
  printf("Press ctrl-D when done > ");
  while ((ch = getchar()) != EOF)
  {
    if ((ch != (' ' || '\t' || '\n')) && 
        (pre_ch == (' ' || '\t' || '\n')))
    {
      ++nw;
    }

    pre_ch = ch;
  }

  printf("\nThere are %d words in the text stream.\n", nw);
}

但是,如果我将if子句更改为:

if ((ch != (' ' || '\t' || '\n')) && 
    (pre_ch == (' ')

(删除pre_ch的标签页和换行符选项),该程序有效。我不明白为什么。

1 个答案:

答案 0 :(得分:4)

虽然看起来很自然,但编写时你不会理解你的意图:

   if ((ch != (' ' || '\t' || '\n')) && 
        (pre_ch == (' ' || '\t' || '\n')))

相反,你需要写:

if ((ch != ' ' || ch != '\t'|| ch != '\n') &&
(pre_ch == ' ' || pre_ch == '\t' || pre_ch == ’\n'))

那就是说,您可能希望在ctype.h中查看isspace()