水平直方图在第一次输入后不接受输入(编辑,不打印输入)

时间:2012-03-26 11:24:28

标签: c

所以我正在制作一个程序,它应该打印输入中单词长度的水平直方图。所以我把时间改成了if if它现在接受了超过1个输入。但这次有什么问题呢?它不会打印图表。

/*Write a program to print a histogram of the lengths of words in its input. 
It is easy to draw the histogram with the bars horizontal*/
#include <stdio.h>
#define MAX 30
#define IN 1
#define OUT 0
int main()
{
int a,c,i,k,state,word[MAX];
a=0;
k=0;
state=OUT;
for(i=0;i<MAX;i++)
    word[i]=0;
while((c=getchar())!=EOF)
{
    if(c==' '||c=='\t'||c=='\n')
        state=OUT;
    else
        state=IN;
    if(state==IN)
        a++;

    if(state==OUT)
        {
        word[i]=a;
        i++;
        a=0;
        }



}
/*This part is pissing me off, I don't know how to print X multiple times!*/
for(i=0;i<MAX;i++)
    if(word[i]>0)
        {
            for(k=0;k<=word[i];k++)
            putchar('-');
            putchar('\n');
        }


}

1 个答案:

答案 0 :(得分:1)

那就是你的问题

while(state==IN)
    a++;

这基本上是一个无限循环,它将永远循环递增a

编辑:好的,第二部分。

首先,您使用a所做的事情并不是您认为的那样。

我认为你认为你正在用它来计算单词长度,但是你没有在每个单词之后将它重置为0,所以它实际上会继续计算找到的字符数。你的直方图只会显示越来越多的数字。

其次,在你的打印循环中,你在两个循环中使用i导致某种美味混乱。

修改:第三部分

我刚发现您正在条件

的输入循环内打印直方图
if((c==getchar())&&c==EOF)

这可能不会起作用,我建议在while循环外移动打印并删除条件

while ((c=getchar())!=EOF)
{
   ...
}
for(i=0;i<MAX;i++)
{
    for(k=0;k<=word[i];k++)
        putchar('-'); 
    putchar('\n');
}

然后在完成输入

后会执行

修改:第四部分

您已将i重新用作数组的索引,而不将其设置为零,结果是程序将字长分配给索引30-59,这些索引都在数组之外,它不会崩溃只是纯粹的运气。在进入输入循环之前设置i = 0会使程序正常工作。

现在你要考虑的是为什么它打印字长度太长了,我把它作为练习留给读者。 提示:它与比较运算符

有关