подсчитать количество строк, слов и символов внутри ввода - PullRequest
4 голосов
/ 14 февраля 2010

Прямо сейчас я изучаю книгу по Си и натолкнулся на пример из книги, который я не могу заставить работать.

#include <stdio.h>
#define IN 1
#define OUT 0
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);
}

Предполагается подсчитать количество строк, слов и символов внутри ввода. Тем не менее, когда я запускаю его в терминале, кажется, ничего не делает. Я что-то упустил или есть проблема с этим кодом?

Ответы [ 6 ]

7 голосов
/ 14 февраля 2010

Программа завершается только после завершения ввода (getchar возвращает EOF). При работе на терминале это обычно никогда не происходит, и из-за этого кажется, что программа зависла. Вам необходимо закрыть ввод вручную, нажав Ctrl + D (возможно, дважды) в Linux или нажав F6 и Enter в начале строки в Windows (разные системы могут использовать разные средства для этого).

2 голосов
/ 14 февраля 2010

Он ожидает ввода на стандартный ввод. Либо перенаправьте в него файл (myprog < test.txt), либо введите данные и нажмите Ctrl-D (* nix) или Ctrl-Z (Windows).

1 голос
/ 14 февраля 2010

getchar () возвращает ввод из стандартного ввода. Начните вводить текст, для которого вы хотите иметь количество слов и количество строк. Ваш ввод прекращается при достижении EOF, что вы делаете, нажимая CTRL D.

CTRL D в этом случае действует как символ окончания передачи.

ура

1 голос
/ 14 февраля 2010

Что он делает, так это вводит цикл для ввода. Если вы вводите символ или символ новой строки, на экране ничего не происходит. Вам нужно прервать процесс (на моем Mac это CTRL + D), который служит EOF. Тогда вы получите результат.

1 голос
/ 14 февраля 2010

Когда вы запустите его, вам нужно набрать текст, нажать return, затем набрать Ctrl-d и return (ничего больше в строке), чтобы указать конец файла. Кажется, работает нормально с моим простым тестом.

0 голосов
/ 14 февраля 2010

Я обычно обрабатываю такой тип ввода (для Linux): 1. создайте файл (например, с именем «input.txt»), введите свой ввод и сохраните 2. использовать канал, чтобы отправить текст в ваше приложение (здесь предположим, что ваше приложение называется «a.out» и находится в текущем каталоге):

cat input.txt | ./a.out

вы увидите, что программа работает правильно.

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