【问题标题】:Horizontal histogram won't accept input after the first input (edited, wont print input)第一次输入后水平直方图不接受输入(已编辑,不会打印输入)
【发布时间】:2012-03-26 11:24:28
【问题描述】:

所以我正在制作一个程序,该程序应该打印其输入中单词长度的水平直方图。所以我将 while 更改为 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');
        }


}

【问题讨论】:

  • 那么它现在可以工作了吗?因为我已经没有明显的发现了。
  • No.. 在我输入后输入 ctrl+z,它只是说按任意键继续.. 然后关闭。
  • 如果你的代码在你的第三部分。它只是打印 - 在新行中 30 次。而不是 ------- (不是 30,而是单词的长度)@r_ahlskog
  • 我只是复制粘贴了你所拥有的,但是是的,那里可能存在一些错误。我现在回家了,可以使用一个不错的编译器,所以我可以实际测试一下。但是,如果您不知道出了什么问题,您应该在调试器中运行它并找出问题。

标签: c


【解决方案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可以使程序工作。

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

【讨论】:

  • 谢谢你!我更新了代码和问题!但现在它不会打印图表。打印代码有什么问题?
  • 哦!我忘记在该代码中键入该部分,我在以前的代码中做过,但该代码不接受输入原因,而不是 if。我做这个的时候忘记了那个部分。我改变了这个:if(state==OUT) { word[i]=a; i++; a=0;}
  • 现在我记得为什么我有一个变量 k,它是用于打印的,所以我在我的 IDE 中再次尝试了它。 for(k=0;k&lt;=word[i];k++) { putchar('-'); } putchar('\n'); 它仍然无法正常工作.. 对不起,如果我是 C 的菜鸟
  • 好吧,也许问题是您正在打印作为循环的特殊情况,将打印代码放在循环之后,这样当您退出循环时它就会打印。
  • 谢谢你!它现在可以工作了!它打印一个长度太长的原因是因为我把for(k=0;k&lt;=word[i];k++) 当它应该只是for(k=0;k&lt;word[i];k++)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2017-11-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多