【问题标题】:How can I replace getchar();?如何替换 getchar();?
【发布时间】:2014-01-21 21:07:16
【问题描述】:
#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) ,用户点击,给出他想要输入的单词数量,因此期望少一个单词。

另外,由于某种原因,最后我得到了一个无限循环。任何帮助和想法将不胜感激。提前致谢。

【问题讨论】:

  • 您的代码直接保存到字符中,这会丢失有关 EOF 的信息,无论如何您都不会对其进行测试。这就是导致麻烦的事情。请记住:getchar() 返回一个 int,它是 char 的值(被视为无符号)或表示 EOF 的负值(通常为 -1)。这是一个超出char 的值,因此返回类型为int。我还没看还有什么问题。

标签: c loops infinite getchar


【解决方案1】:

将代码的第一个块更改为如下所示:
(测试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);
    }

}

【讨论】:

  • 它没有帮助。我改变了它。然后运行它。它得到了第一个 printf 的权利。然后我给了数字 5。然后它打印了“给下一个词。给下一个词。”然后只接受了 4 个单词,而不是我期望的 5 个单词。在我输入第 4 个单词后,它开始在整个地方打印“*”。
  • 在这种情况下如何使用 scanf(),因为我希望用户能够输入整个单词?
  • 好的,我将使用 printf 和 scanf 组合编辑我的答案...(scanf() 非常适合输入整个单词)
  • 好的,我适应了你的建议,但不是'q'(假设'q'可能是用户输入的“有效”词)当用户输入时我如何让它停止例如点击esc?
【解决方案2】:

在第一个循环中更新字母计数不是更容易吗?

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]++;
}

因此不需要第二个循环。

【讨论】:

  • 我认为这是错误的:s[-1]。除此之外,我真的不明白为什么它与我所做的不同以及为什么它会使第二个循环无用。
  • *s = '\0' 可能是你的意思? (s[-1] 有一个负数组索引,这是不允许的)
  • @Mechanic45:研究其他人的代码并尝试理解它是如何工作的以及为什么它会工作,会让你成为一个更好的程序员。只是相信它是错误的,不会。
  • s 将在换行符后一个字节,据我所知,允许使用负索引。
【解决方案3】:

以下两行有错误的结束条件;应该是&lt;n,而不是&lt;=n。目前他们检索一个未初始化的数组元素。由于您将 str 声明为局部变量,因此该元素通常填充有垃圾,即 very 大随机数。这或许可以解释为什么最后一个循环需要很长时间(但可能不是永远)才能完成。

for (j=i+1;j<=n;j++)

}while ((i<=n));

另外,我假设直方图的第 n 行应该包含有 n 个字母的单词的数量?这不是你现在正在做的事情。

letters[i] = count;

那行应该是:

letters[key] = count;

但要使 起作用,您应该覆盖相同的数组 letters;你必须为你的直方图声明一个新数组,否则第二个循环会破坏它自己的输入。

顺便说一句,str 似乎完全多余。是否用于调试目的?

【讨论】:

  • 关于你是对的。关于直方图,它应该显示一个包含 n 个字母的单词用星号 (*) 给出的次数。字母的数量和直方图的线数之间没有联系。
  • @Mechanic45:我说的是行号,而不是行数。哦,但是现在您提到它:行数也有问题。不过别担心,既然无限循环已经不碍事了,你很快就会发现的。忠告:开始学习使用调试器,它将帮助您掌握自己的程序。
  • 嗯..确实我的意思是:“......字母的数量和直方图的个别线的数量。” (不是总行数)感谢您的建议。
猜你喜欢
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多