2 qq 26435647 qq_26435647 于 2016.03.08 10:54 提问

这段程序问题在哪里,编译后的结果让我很费解

#include
#include
int main()
{
float x,y,z,k;
char s,q;
printf("请输入加油量:\n");
scanf("%f",&x);
printf("请输入服务类型:\n");
printf("a.自己加\n");
printf("b.自助加\n");
scanf("%c",&s);
switch(s)
{
case 'a':
z=0.95;
break;
case 'b':
z=0.9;
break;
default:
printf("error");
}
printf("请输入汽油品种:\n");
scanf("%c",&q);
switch(q)
{
case 'a':
y=3.25;
break;
case 'b':
y=3.00;
break;
case 'c':
y=2.75;
}
k=x*y*z;
printf("所购汽油价格:%f\n",k);

Sleep(10000);
return 0;

}

4个回答

u013596119
u013596119   Rxr 2016.03.08 11:19
已采纳

这样就好了,scanf读取的是缓存区的字符,你上一个scanf输入的最后会有\n,就直接被下一个scanf读取了


#include <stdio.h>
int main()
{
float x,y,z,k;
char s,q;
printf("请输入加油量:\n");
scanf("%f",&x);
fflush(stdin);
printf("请输入服务类型:\n");
printf("a.自己加\n");
printf("b.自助加\n");
scanf("%c",&s);
fflush(stdin);
switch(s)
{
case 'a':
    z=0.95;
    break;
case 'b':
    z=0.9;
    break;
default:
    printf("error");
}
printf("请输入汽油品种:\n");
scanf("%c",&q);
switch(q)
{
case 'a':
y=3.25;
break;
case 'b':
y=3.00;
break;
case 'c':
y=2.75;
}
k=x*y*z;
printf("所购汽油价格:%f\n",k);
return 0;
}
qq_27819077
qq_27819077   2016.03.08 11:06

在读取服务类型的scanf语句前加个getchar();。你在输入第一个加油量后再缓存区里还有一个\n在,会被scanf()直接读入。

John_ToStr
John_ToStr   Rxr 2016.03.08 15:45

怎么个费解法,有一种情况,你这代码在vs 2012以上的版本是编译通不过的,提示scanf不安全换成scanf_s即可

还有你的代码逻辑有严重的问题。

John_ToStr
John_ToStr   Rxr 2016.03.08 16:09

记得每次在输入之前要清空输入缓冲区,否则的话次变量被赋予的只不是你想要的。
图片说明
图片说明
图片说明
图片说明

代码除了我改的还有很大的漏洞,请自行修改,这种防御式编程的思想很重要...

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!