计算换行符,空格和制表符

时间:2010-07-10 22:19:30

标签: c whitespace

这个问题来自K& R p。 20:编写一个程序来计算空格,制表符和换行符。

这是我的尝试:

#include <stdio.h>

int main()
{
  int character, whitespace = 0;

  printf("Enter some text, and press Ctrl-d when you're done.\n\n");

  while((character = getchar() != EOF) {
    if(character == (' ' || '\n' || '\t')) {
      ++whitespace;
    }
  }

  printf("\nYour text contains %d spaces, tabs, and lines.\n", whitespace);

  return 0;
}

该程序不起作用。无论用户文本包含多少空格,制表符和换行符,它总是给出答案0。有谁能看到这个问题?还有一件奇怪的事情:我必须按两次Ctrl-d才能注册。我不知道为什么。 谢谢!

6 个答案:

答案 0 :(得分:18)

if(character == (' ' || '\n' || '\t'))

测试character是否等于(' ' || '\n' || '\t')的结果(结果为1,表示||的结果为真)。您需要针对三个可能值中的每一个单独测试它,例如,

if(character == ' ' || character == '\n' || character == '\t')

答案 1 :(得分:3)

你可能遇到的一个问题是你的病情。

尝试类似:

if (character == '\n' || character == ' ' || character == '\t') {
    ++ whitespace;
}

答案 2 :(得分:1)

你的while语句中的括号是错误的,它应该是

while( (character = getchar()) != EOF) 

您为测试getchar() != EOF的值指定了字符,对于任何真正读过的字符,该值为1。

答案 3 :(得分:1)

您的代码问题是if(character == (' ' || '\n' || '\t'))语句。语句(' ' || '\n' || '\t')等同于32 || 13 || 9(每个字符由等效的ASCII值替换)等于1,因为任何非零事物都被视为C中的true C ++,你有效地做if(character == 1)。现在我认为您可以解决代码中的问题。

书籍也说分别计算空白,制表符和换行符,你试图计算总数,所以做这样的事情。

if(character == ' ')
  ++blanks;

if(character == '\t')
  ++tabs;

if(character == '\n')
  ++newlines;

如果你想要一个完整的解决方案,这是我很久以前写的一个。

#include <stdio.h>

int main(void)
{
  int blanks, tabs, newlines;
  int c;


  blanks = 0;
  tabs = 0;
  newlines = 0;

  do {
      c = getchar();
      if(c == ' ') {
          ++blanks;
      }
      else if(c == '\t') {
         ++tabs;
      }
      else if(c == '\n') {
         ++newlines;
      }
  }
  while(c != EOF)

  printf("Blanks: %d\nTabs: %d\nLines: %d\n", blanks, tabs, newlines);
  return 0;
}

答案 4 :(得分:0)

isspace将作为宏或函数提供,具体取决于您的系统,并且您无需再次猜测可能构成环境空白的内容。严格来说,它可能是您系统上的以下所有字符。 GNU C当然这么认为。

' '
    space
'\f'
    formfeed
'\n'
    newline
'\r'
    carriage return
'\t'
    horizontal tab
'\v'
    vertical tab

这就是你可以进行测试的方法。

 #include <ctype.h>

  while((character = getchar() != EOF) {
    if (isspace(character)) whitespace++;
  }

答案 5 :(得分:0)

以上示例在技术上是正确的。它仅在调用EOF(文件结束)指示符后才打印值。但是,我认为这个练习有更好的解释(1.8),所以让我提出一个替代方案。下面的代码将在每个新行之后立即打印新行,制表符和空白。

#include <stdio.h>
#define EOL '\n'

/* Excercise 1.8 - K&R's book - 2nd edition. */
main()
{
    int c, newlines, tabs, blanks;

    newlines = 0;
    tabs = 0;
    blanks = 0;

    while ((c = getchar()) != EOF)
    {
        if (c == '\n')
            ++newlines;
        else if (c == '\t')
            ++tabs;
        else if (c == ' ')
            ++blanks;

        if (c == EOL) {
        printf("Lines: %d\nTabs: %d\nBlanks: %d\n", newlines, tabs, blanks);
        }
    }
}