подсчет новых строк, пробелов и вкладок - PullRequest
2 голосов
/ 11 июля 2010

Эта проблема от 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 ]

18 голосов
/ 11 июля 2010
if(character == (' ' || '\n' || '\t'))

проверяет, равен ли character результату (' ' || '\n' || '\t') (результат равен 1, что указывает на истинность результата ||). Вам необходимо проверить его индивидуально по каждому из трех возможных значений, например,

if(character == ' ' || character == '\n' || character == '\t')
3 голосов
/ 11 июля 2010

Одной из проблем, с которыми вы можете столкнуться, является ваше состояние.

Попробуйте что-то вроде:

if (character == '\n' || character == ' ' || character == '\t') {
    ++ whitespace;
}
1 голос
/ 11 июля 2010

проблема с вашим кодом - if(character == (' ' || '\n' || '\t')) оператор.Выражение (' ' || '\n' || '\t') эквивалентно 32 || 13 || 9 (каждый символ заменяется на его эквивалентное значение ASCII), что равно 1, поскольку любая ненулевая вещь считается true в C / C ++, поэтому эффективно вы делаете if(character == 1).Теперь я думаю, что вы можете исправить эту проблему в своем коде.

Также книги говорят, что нужно подсчитывать пробелы, табуляции и новые строки по отдельности, и вы пытаетесь подсчитать общее число, поэтому сделайте что-то вроде этого.1010 *

Если вы хотите законченное решение, вот то, которое я написал давно.

#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;
}
1 голос
/ 11 июля 2010

Скобки в вашем утверждении while неверны, это должно быть

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

Вы присвоили символу значение теста getchar() != EOF, которое равно 1 для любого символа, который действительно был прочитан.

0 голосов
/ 08 марта 2018

Приведенные выше примеры являются технически правильными.Он печатает значения только после вызова индикатора 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);
        }
    }
}
0 голосов
/ 11 июля 2010

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