#include <stdio.h>
int main (void)
{
int n;
printf("Give the number of words you want to input.");
scanf("%d",&n);
int letters[n],i,j,count,key,k;
char str[100];
//Scans each word, counts it's letters and stores it in the next available
//position in "letters" array.
for (i=0;i<n;i++)
{
j=0;
printf("Give the next word.");
do{
str[j] = getchar();
j++;
}while (str[j-1]!='\n');
str[j-1] = '\0';
letters[i] = j;
}
//Compacts the data by figuring out which cells have the same number of letters
for (i=0;i<n;i++)
{
key = letters[i];
count = 0;
for (j=i+1;j<=n;j++)
{
if (key==letters[j])
{
count += 1;
letters[j] = 0;
}
}
letters[i] = count;
}
//creates a histogram
i=0;
do{
printf("%d|",i);
for (j=1;j<=letters[i];j++)
{
printf("*");
}
printf("\n");
i++;
}while ((i<=n));
return 0;
}
我理解getchar();读取,第一次输入(\ n),用户点击,给出他想要输入的单词数量,从而期望少一个单词。
另外,我最后因某种原因得到了一个infite循环。任何帮助和想法将不胜感激。提前谢谢。
答案 0 :(得分:0)
在第一个循环中更新字母数不是更容易吗?
memset(letters, 0, n);
for (i=0;i<n;i++)
{
char* s = str;
int j=0;
printf("Give the next word.");
do{
*s = getchar();
++j;
}while (*(s++)!='\n');
s[-1] = '\0';
letters[j-1]++;
}
因此,第二个循环将是不必要的。
答案 1 :(得分:0)
将代码的第一个块更改为如下所示:
(测试getchar的输出,并且仅在不是EOF时继续)
for (i=0;i<n;i++)
{
j=0;
printf("Give the next word.");
do{
a = getchar();
if(a >= 0)
{
str[j] = a;
j++;
}
else break;
}while (str[j-1]!='\n');
str[j-1] = '\0';
letters[i] = j;
}
但关于你的问题:如何替换getchar();?您是否考虑过使用scanf()
?
修改强>
以下是使用scanf()
和printf()
提示输入然后显示输入的简单示例。它将允许用户输入整个单词或句子(最多80个字符),直到输入“q”。不完全是你在做什么,但你应该能够适应你的代码......(运行这个)
int main(void)
{
char buf[80]={""};
while( strcmp(buf, "q") != 0) //enter a 'q' to quit
{
buf[0]=0;
printf("enter string:\n");
scanf("%s", buf);
printf("%s\n", buf);
}
}
答案 2 :(得分:0)
以下两行的结束条件错误;应为<n
,而不是<=n
。目前,他们检索未初始化的数组元素。由于您将str
声明为局部变量,因此该元素通常填充垃圾,即非常大随机数。这也许可以解释为什么最后一个循环需要花费很长时间(但可能不是永远)。
for (j=i+1;j<=n;j++)
}while ((i<=n));
另外,我假设直方图的 n 行应该包含 n 字母的单词数量?那不是你现在正在做的事情。
letters[i] = count;
该行应该是:
letters[key] = count;
但是要使 工作,你应该不覆盖同一个数组letters
;你必须为直方图声明一个新数组,否则第二个循环会破坏它自己的输入。
顺便说一句,str
似乎完全是多余的。它是否用于调试目的?