杭电acm2031 很简单的一道题 可是我不知道错在 哪里

2024年11月03日 00:04
有3个网友回答
网友(1):

★错误表现:你的程序是第一次操作时可以输出正确的结果,接下来就不能了。

★错误原因:第一次可以输出正确的结果很容易理解,那为什么接下来就不行了呢?这是由于你第一次输入后要看结果需要按回车键,比如,你输入了:

a apple然后回车,系统就把a送给n,把apple送给a[200],并输出0.2。然后进行第二次输入操作,但是请注意,由于之前你在第一次输入操作完成后敲了回车换行,所以当你第二次输入b boddy时,系统是把你第一次输入完成后敲的回车‘\n’赋给字符变量n,再把b赋给字符串数组a[200],所以第二次n和a[200]分别得到的是'\n'和'b',而不是预期的'b'和"boddy"。接下来地第三次、第四次、

……都受上一次输入完成后敲的回车符影响,而无法得到正确的结果。

★解决方法:为了使n和a[200]每次都得到预期值,要在给它们赋值之前,把前一次输入完成后敲的回车符“吞掉”。具体做法就是再定义一个字符变量。但这样带来一个小小的不便利,那就是第一次进行输入操作时也要先敲一下回车。

★修改过的代码:

#include

#include 

#include 

int main()

{

 char a[200];

 char n;

 char t;

 printf("Press ENTER before you input n and a[200] for the first time:");

    while(scanf("%c%c %s",&t,&n,a))/*a是一个字符数组名,所以a前不用要&*/

 {

  double sum=0;

  int i;

  int x=strlen(a);

  /*printf("%d %s\n",n,a);*/

  for(i=0;a[i]!='\0';i++)

  {

   if(islower(n))

   {

    if(a[i]==n || a[i]+32==n)

     sum++;

   }

   else

    if(a[i]==n || a[i]-32==n)

     sum++;

  }

  printf("%.5lf\n",sum/x);

 }

 return 0;

★截图:

网友(2):

1、输入结束条件错了
改了while(scanf("%c %s",&n,&a)!=EOF)

2、过滤空白字符
在printf("%.5lf\n",sum/x);
后加getchar();

网友(3):

for(i=0;a[i]!='\0';i++)
{
if(islower(n))
{
if(a[i]==n || a[i]+32==n)
sum++;
}
else
if(a[i]==n || a[i]-32==n)//这里这个if语句要加{},其他的没看
sum++;
}