繁体   English   中英

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

[英]counting newlines, spaces, and tabs

这个问题来自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才能注册。 我不知道为什么。 谢谢!

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

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

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

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

尝试类似的东西:

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

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

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

你赋予了字符test getchar() != EOF的值,对于任何真正读过的字符都是1。

您的代码的问题是if(character == (' ' || '\\n' || '\\t'))语句。 语句(' ' || '\\n' || '\\t')相当于32 || 13 || 9 32 || 13 || 9 32 || 13 || 9 (每个字符由等效的ASCII值替换)等于1因为任何非零的东西在C / C ++中都被认为是true ,所以你有效地做了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;
}

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++;
  }

以上示例在技术上是正确的。 它仅在调用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);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM