★错误表现:你的程序是第一次操作时可以输出正确的结果,接下来就不能了。
★错误原因:第一次可以输出正确的结果很容易理解,那为什么接下来就不行了呢?这是由于你第一次输入后要看结果需要按回车键,比如,你输入了:
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;
}
★截图:
1、输入结束条件错了
改了while(scanf("%c %s",&n,&a)!=EOF)
2、过滤空白字符
在printf("%.5lf\n",sum/x);
后加getchar();
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++;
}