马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<stdio.h>
int main()
{
double x;
double sum=0;
int z;//1自己加,2协助加
char ch;//存放类型
printf("请输入要加的量:");
scanf("%lf",&x);
printf("请输入要加的类型(A/B/C):");
scanf(" %c",&ch);//如果这个前面没有空格的话,就会执行defalut
switch(ch)
{
case 'A':sum=5.75*x;break;
case 'B':sum=6.00*x;break;
case 'C':sum=7.15*x;break;
default :printf("输入类型错误\n");
}
printf("请输入需要的服务(1/2):");
scanf("%d",&z);
if(z==1)
printf("你要付的钱是%lf\n",sum*0.95);
else
printf("你要付的钱是%lf\n",sum*0.9);
return 0;
}
/*scanf(" %c",&ch) ;
%c前面的空格就是用来屏蔽空白符的,但想要弄明白这个问题,必须要知道scanf的工作原理。 但在此之前,我们先介绍两个专业术语。
1、缓冲区
缓冲区是一块存放临时输入数据的内存,我们在键盘上输入数据之所以不会马上显示,就是因为数据存放在了缓冲区,在上面例子中,当我们按下回车键后,缓冲区的数据会传送到标准输入流。
2、标准输入流
标准输入流(stdin)是文件指针,scanf()就是从标准输入流获取数据。
以上面代码为例,当执行到scanf()时,开始等待用户输入,当我们输入数据,在按下回车键前会把数据储存在缓冲区,按下回车键后,会把数据以及换行符(\n)一起传送到标准输入流(stdin)中,scanf()就是从标准输入流中或许数据,上面第一个scanf()要读入一个整数,它从标准输入流中查找,跳过空白符(空格、换行符、制表符),如果遇到数字,则开始读入,直到遇到非数字的字符结束,最后计算读取到的数值,储存到相关变量中。
所以对于scanf()而言,%c是个较为特殊的说明符。 %c前没空格,scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()则读取标准输入流中第一个非空白字符。
*/
这是百度搜到的,但是看完就懵了啥时候就要加空格了,啥时候就不用加
好好学习一下scanf函数的用法。
你的程序中第一个读取的是double类型变量,必须要以空白符(回车、空格、Tab)或者非数字符号(例如ABC、+-*等等)作为分隔符以说明double类型变量已经输入完成了,执行完第一个scanf语句后将会把读取到的double类型赋值给x,然而此时缓冲区中会剩下一个空白符或者去她类型的字符,空白符本身也是一个char类型变量,因此你的第二句scanf执行的时候,若%c之前没有空格,则会将那个空白符赋值给变量ch,那么就会出现你题中所述的现象。
我猜想一下你的程序执行过程:程序开始运行……然后你输入一个double(我们假设为1.5),然后回车,你再输入一个char字符(我们假设是B)……
当你输入1.5,再回车的时候,实际上程序吧1.5赋值给x,缓冲区会剩下一个空白符,当执行第二句scanf时,会把缓冲区的回车当做scanf语句中的空格,然后把B赋值给ch,程序顺利通过。若第二个scanf语句中%c之前没有空格,那么程序会把缓冲区的回车赋值给ch,根本不给你输入B的机会。。。。
解决方法,你可以在第二句scanf语句之前添加一句getchar(),这句是读取一个缓冲区的字符,这样就相当于清除掉第一句之后的回车字符了。
编程就需要多尝试,,二楼说的很对,就是需要自己多写。你的这个程序,你可以尝试一次性输入三个变量,例如:直接输入1.5B2,然后回车,看看运行结果。当然,前提是把第二句中的空格删掉。
你可以看看我之前在一个帖子中的回答。
之前的一个回答
|