2015-02-06 116 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

正确地使用缩进格式化您的代码,并将大括号放在大的if和while中。我无法遵循这个代码。 – 2015-02-06 17:31:14

回答

3

你的程序不会打印任何东西,直到getchar()返回EOF。这意味着输入一个词并实现回报是不行的。您需要在空白行上按^D来告诉终端仿真程序关闭输入流。

这里的快速测试似乎表明您的程序正常工作。您可能想要检查您的大逻辑&&/||逻辑中的操作顺序 - 铿锵告诉我||内有关于&&的一些警告。

+2

'Ctrl + Z'为windows终端。 – HolyBlackCat 2015-02-06 17:36:18

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,可重复,避免了需要每次输入一些单词。