新人求助,一个简单的计算器程序问题
本帖最后由 风之残月 于 2014-11-10 10:15 编辑#include <stdio.h>
void main()
{
double a,b;
char c;
printf("please input a number:");
scanf("%lf",&a);
printf("please input another number:");
scanf("%lf",&b);
printf("please input the operational character:");
scanf("%c",&c);
switch(c)
{
case '+':
printf("%lf + %lf = %lf\n",a,b,a + b);
break;
case '-':
printf("%lf - %lf = %lf\n",a,b,a - b);
break;
case '*':
printf("%lf * %lf = %lf\n",a,b,a * b);
break;
case '/':
printf("%lf / %lf = %lf\n",a,b,a / b);
break;
default:
printf("error\n");
}
}
file:///C:\Users\kami\AppData\Roaming\Tencent\Users\409352418\QQ\WinTemp\RichOle\~0N_`R15LQ2[_O5JO0J3L@8.jpg
程序如上,结果如图,为何没等我输入运算符就直接报错了!!求指点
sliver_sky 发表于 2014-7-24 22:25
缓冲区。。。不太好理解啊,鱼c视频有讲吗,我才看到第三章
输入:22进入缓冲区
输入:回车 '\n'进入缓冲区
赋值:b=2
此时缓冲区里还有个'\n'
就被赋给了c
scanf前加个fflush(stdin);(清空标准输入设备的缓冲区)就好了
或者用getch();读取一个字符来清除\n 本帖最后由 oggplay 于 2014-7-24 19:26 编辑
变通一下吧:
#include <stdio.h>
int main()
{
double a,b;
char c;
printf("输入一个表达式,例如1.1+2.2:\n");
scanf("%lf %c %lf",&a,&c,&b);
switch(c)
{
case '+':
printf("%lf + %lf = %lf\n",a,b,a + b);
break;
case '-':
printf("%lf - %lf = %lf\n",a,b,a - b);
break;
case '*':
printf("%lf * %lf = %lf\n",a,b,a * b);
break;
case '/':
printf("%lf / %lf = %lf\n",a,b,a / b);
break;
default:
printf("error\n");
}
}
[\b] oggplay 发表于 2014-7-24 19:24
变通一下吧:
变通一下是可以,就是不知道错的原因,很纠结。。 哦!是这样的,在你将要输入字符的时候你按了一下回车,其实是把回车的字符'\n'输进去了,然后就执行错误的那个语句,我给你改了一下,你看一下:
#include <stdio.h>
void main()
{
double a,b;
char c;
printf("please input a number:");
scanf("%lf",&a);
printf("please input another number:");
scanf("%lf",&b);
printf("please input the operational character:");
scanf("%c",&c);
if(c == '\n') //如果输入的是回车键的话
{
scanf("%c", &c);
}
switch(c)
{
case '+':
printf("%lf + %lf = %lf\n",a,b,a + b);
break;
case '-':
printf("%lf - %lf = %lf\n",a,b,a - b);
break;
case '*':
printf("%lf * %lf = %lf\n",a,b,a * b);
break;
case '/':
printf("%lf / %lf = %lf\n",a,b,a / b);
break;
default:
printf("error\n");
}
}
这是运行后的效果:
本帖最后由 oggplay 于 2014-7-24 19:47 编辑
sliver_sky 发表于 2014-7-24 19:29
变通一下是可以,就是不知道错的原因,很纠结。。
你这个跟缓冲区有关,输入流需要刷新,比如scanf一个后记得试试fflush(stdin),但只限于windows下。如果你的stdio库里有fpurge函数,请用它替代fflush。
#include <stdio.h>
int main()
{
double a,b;
char c;
printf("please input a number:");
scanf("%lf",&a);
fpurge(stdin);
printf("please input another number:");
scanf("%lf",&b);
fpurge(stdin);
printf("please input the operational character:");
scanf("%c",&c);
fpurge(stdin);
switch(c)
{
case '+':
printf("%lf + %lf = %lf\n",a,b,a + b);
break;
case '-':
printf("%lf - %lf = %lf\n",a,b,a - b);
break;
case '*':
printf("%lf * %lf = %lf\n",a,b,a * b);
break;
case '/':
printf("%lf / %lf = %lf\n",a,b,a / b);
break;
default:
printf("error\n");
}
}
[\b] 没清空缓存
输入完之后
加上
while((ch = getchar())!='\n'); 你的c是个字符变量,当你输完另一个number之后按的那个回车键产生了一个换行符,直接赋给变量c,结果就变成错误了。清空缓冲区就好。 青玄 发表于 2014-7-24 19:37
哦!是这样的,在你将要输入字符的时候你按了一下回车,其实是把回车的字符'\n'输进去了,然后就执行错误的 ...
原来回车键也能当成字符,长姿势了 sliver_sky 发表于 2014-7-24 22:03
原来回车键也能当成字符,长姿势了
对啊! 你不知道吗!呵呵! {:2_27:} oggplay 发表于 2014-7-24 19:42
你这个跟缓冲区有关,输入流需要刷新,比如scanf一个后记得试试fflush(stdin),但只限于windows下。如果 ...
呀,还没学到这函数呢,做个笔记先 Nightnjl 发表于 2014-7-24 20:40
你的c是个字符变量,当你输完另一个number之后按的那个回车键产生了一个换行符,直接赋给变量c,结果就变成 ...
缓冲区。。。不太好理解啊,鱼c视频有讲吗,我才看到第三章 输入2后有个回车符,算作字符的,所以直接被读取了
也就是c='\n'
然后执行switch
自然报错了 明显, 第二个输入数字时, 把你的回车读进去了。 绝尘の初 发表于 2014-7-24 22:53
输入:22进入缓冲区
输入:回车 '\n'进入缓冲区
赋值:b=2
输入1,回车,1进缓冲区,由于下一个是double型,回车不进缓冲区;
输入2,回车,2进缓冲区,由于下一个是char型,回车进缓冲区;
是这样的意思不? 在scanf的下一行加个 getchar()来接收空格字符吧比如
scanf("%lf",&a);
getchar(); 我明白了,谢谢各位。 函数 没学好吧
页:
[1]