Я использую Turbo C ++, и моя программа не производит вывод - PullRequest
4 голосов
/ 22 июля 2010

Название в значительной степени говорит само за себя, поэтому вот код:

#include <stdio.h>

/* Program counts blanks, tabs, and newlines */
int main(void)
{
  int c;
  int b, t, nl;

  b = 0;
  t = 0;
  nl = 0;

  while ((c = getchar()) != EOF)
    if (c == ' ')
      ++b;
    if (c == '\t')
      ++t;
    if (c == '\n')
      ++nl;
  printf("Input has %d blanks, %d tabs, and %d newlines\n", b, t, nl);
  return 0;
}

Я не понимаю, почему это не работает.Он не учитывает пробелы, но когда дело доходит до остальных, их значения всегда печатаются как 0.

Больше, чем ответ "вот как это должно быть", мне бы очень хотелось, чтобыне работает, потому что ... вам нужно сделать это, потому что ... "ответьте, пожалуйста.Я пытаюсь понять концепции и на самом деле понять язык больше, чем просто знать, что работает, а что нет.

Спасибо!Вам, ребята, уже помогли тонны:).

Ответы [ 2 ]

15 голосов
/ 22 июля 2010

Это потому, что вам не хватает скобок для петли while.Без этих скобок в while есть только первое выражение if.Вот почему это только подсчет пробелов, потому что вы просматриваете весь файл, выполняя этот оператор one if, а затем, после выхода из цикла, c равен EOF, поэтому ни один из двух других ifутверждения будут истинными.

Это было сложно, трудно увидеть, потому что отступы выглядят так, как будто они должны работать, но, в отличие от Python, компилятор не использует отступы, чтобы выяснить, где что находится :-)

Если вы ставите открывающую скобку после while и закрывающую скобку перед printf, она должна считать все.

Другими словами, это то, что видит ваш компилятор:

while ((c = getchar()) != EOF) {
    if (c == ' ')
        ++b;
}
if (c == '\t')
    ++t;
if (c == '\n')
    ++nl;

тогда как вы хотите:

while ((c = getchar()) != EOF) {
    if (c == ' ')
        ++b;
    if (c == '\t')
        ++t;
    if (c == '\n')
        ++nl;
}
0 голосов
/ 22 июля 2010

Я вижу здесь много «всегда требующих фигурных скобок».Это нормально, и это предотвратит это, но я предпочитаю всегда использовать хороший редактор.Emacs, например, автоматически сделает отступ в коде C, чтобы сделать подобные вещи очень очевидными.Ваши 2-е и 3-е операторы if не будут отступать так, как они есть.

Другой вариант, если вам не нравятся фигурные скобки, это использовать else if там, где вы используете if.Не делай этого, но понимай это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...