2015-02-06 3 views
1

У меня есть следующая c-программа, которая должна печатать нашу вертикальную гистограмму длин слов на ее входе.C Программа, ничего не печатается в терминале

#include <stdio.h> 

#define MAX_WORD_LENGTH  35  /* maximum word length we will support */ 

int main(void) 
{ 
int i, j;      /* counters */ 
int c;      /* current character in input */ 
int length;     /* length of the current word */ 
int lengths[MAX_WORD_LENGTH]; /* one for each possible histogram bar */ 
int overlong_words;   /* number of words that were too long */ 

for (i = 0; i < MAX_WORD_LENGTH; ++i) 
    lengths[i] = 0; 
overlong_words = 0; 

while((c = getchar()) != EOF) 
    if (c == ' ' || c == '\t' || c == '\n') 
     while ((c = getchar()) && c == ' ' || c == '\t' || c == '\n') 
      ; 
    else { 
     length = 1; 
     while ((c = getchar()) && c != ' ' && c != '\t' && c != '\n') 
      ++length; 
     if (length < MAX_WORD_LENGTH) 
      ++lengths[length]; 
     else 
      ++overlong_words; 
    } 

printf("Histogram by Word Lengths\n"); 
printf("=========================\n"); 
for (i = 0; i < MAX_WORD_LENGTH; ++i) { 
    if (lengths[i] != 0) { 
     printf("%2d ", i); 
     for (j = 0; j < lengths[i]; ++j) 
       putchar('#'); 
      putchar('\n'); 
     } 
    } 
} 

Я это скомпилирован как a.out, в терминале я делаю ./a.out, я ввожу слово и ничего не происходит. Любая помощь? Я новичок в C и просто хочу учиться.

+2

Правильно отформатируйте свой код с помощью отступов и поместите фигурные скобки на свои большие, если и в то время. Я вообще не могу следовать этому коду. –

ответ

3

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

Быстрое испытание здесь показывает, что ваша программа работает. Вы можете проверить порядок операций в своей большой логике - clang дал мне несколько предупреждений о && в пределах ||.

+2

'Ctrl + Z' для окна терминала. – HolyBlackCat

0

В вашем коде есть логические проблемы.

Предположим, что вход «a». Тогда с этим:

while ((c = getchar()) && c != ' ' && c != '\t' && c != '\n') 
     ++length; 

программа входит в бесконечный цикл, потому что вы не проверить EOF, которая отлична от нуля.

Попробуйте что-то вроде этого, вместо:

int in_word = 0; 
do { 
    c = getchar(); 

    if ((c == EOF) || isspace (c)) { 
     if (in_word) { 
      in_word = 0; 
      if (length < MAX_WORD_LENGTH) { 
       lengths[length]++; 
      } 
      else { 
       overlong_words++; 
      } 
     } 
    } 
    else { 
     if (!in_word) { 
      in_word = 1; 
      length = 1; 
     } 
     else { 
      length++; 
     } 
    } 
} while (c != EOF); 

Для тестирования вы можете сделать это:

$ echo -n "Lorem ipsum dolor sit amet" | ./main 

Это даст ПРОГРАММЕ EOF ему необходимо прекратить, повторим и исключает необходимость введите несколько слов в каждое время.

Смежные вопросы