我怎样才能替换getchar();?

时间:2014-01-21 21:07:17

标签: c loops infinite getchar

#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循环。任何帮助和想法将不胜感激。提前谢谢。

3 个答案:

答案 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似乎完全是多余的。它是否用于调试目的?