Программа не распечатывает номера - PullRequest
1 голос
/ 12 июля 2011

Я новичок в C, и я купил книгу "Язык программирования C" и начал читать и делать все, что он говорит.В книге есть код, который должен распечатать количество строк, слов и символов предложения.Это код книги.

#include <stdio.h>
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */


/* count lines, words, and characters in input */
main()
{
 int c, nl, nw, nc, state;

 state = OUT;
 nl = nw = nc = 0;
 while ((c = getchar()) != EOF) {
      ++nc;
      if (c == '\n')
          ++nl; 
      if (c == ' ' || c == '\n' || c = '\t')
          state = OUT;
      else if (state == OUT) {
          state = IN;
          ++nw;
      }
 }
printf("%d %d %d\n", nl, nw, nc);
} 

По некоторым причинам значения, которые должны быть распечатаны с помощью printf, не отображаются.Я действительно не знаю, что не так.Он выводит числа только в том случае, если я помещаю printf в цикл while, но это не может быть правильным, потому что он печатает числа каждый раз, когда значения меняются.

Ответы [ 5 ]

3 голосов
/ 12 июля 2011

В этой строке есть опечатка - присвоение c = '\t' всегда оценивается как истинное

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

Чтобы исправить, измените = на ==

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

Чтобы ответитьваш вопрос почему он ничего не выводит - я думаю, что компилятор либо выдает ошибку, либо предупреждение, в результате чего программа не связывается, и, следовательно, вы фактически не компилируете исходный код, как указано в списке,скорее вы используете старую версию кода, скомпилированного ранее.

1 голос
/ 12 июля 2011

Похоже, что вы читаете свой ввод с STDIN (клавиатуры) и оставляете цикл только на «Конце файла», что не произойдет. Делай, как подсказывает другой ответ.

1 голос
/ 12 июля 2011

gcc выдает ошибку компиляции в этой строке:

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

глядя @ на эту строку, легко обнаружить опечатку: c = '\t')

пропущен тест на равенство, нет?:)

0 голосов
/ 10 марта 2013

это была проблема равенства, как указано выше в if (c == ' ' || c == '\n' || c = '\t'). Я бы посоветовал вам использовать хорошую IDE, например Eclipse CDT , которая предупреждает вас о таких ошибках.

0 голосов
/ 13 июля 2011

Помимо опечатки, упомянутой другими, вам нужно отправить сигнал конца файла, чтобы завершить цикл ввода. Это будет зависеть от среды, в которой вы его используете - будет Ctrl + Z в Windows и должно быть Ctrl + D в * NIX. Мне нужно было ввести это в новой строке и потом нажать Enter при использовании моей обычной IDE (Code :: Blocks).

What it looks like

Помните также, что во время написания K & R (1 & 2) программирование в командной строке было нормой, и обычно вы ожидали, что результат будет виден, если вы только что завершили программу. Некоторые IDE закрывают свой эмулятор терминала в конце программы, прежде чем вы сможете просмотреть результаты, поэтому вам может потребоваться добавить что-то вроде

printf("\nPress return to continue");
getchar();

в конце программы. Или запустите его самостоятельно из эмулятора терминала ОС (используя cmd.exe в Windows, или gnome-терминал, yakuake или что-нибудь другое, что предоставляет ваша ОС). Перейдите в папку и

your_executable.exe

или

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