鱼C论坛

 找回密码
 立即注册
查看: 3493|回复: 18

新人求助,一个简单的计算器程序问题

[复制链接]
发表于 2014-7-24 19:00:48 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 风之残月 于 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");
        }
}
[img]file:///C:\Users\kami\AppData\Roaming\Tencent\Users\409352418\QQ\WinTemp\RichOle\~0N_`R15LQ2[_O5JO0J3L@8.jpg[/img]
程序如上,结果如图,为何没等我输入运算符就直接报错了!!求指点


~0N_`R15LQ2[_O5JO0J3L@8.jpg

最佳答案

查看完整内容

输入:2 2进入缓冲区 输入:回车 '\n'进入缓冲区 赋值:b=2 此时缓冲区里还有个'\n' 就被赋给了c scanf前加个fflush(stdin);(清空标准输入设备的缓冲区)就好了 或者用getch();读取一个字符来清除\n
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 19:00:49 | 显示全部楼层
sliver_sky 发表于 2014-7-24 22:25
缓冲区。。。不太好理解啊,鱼c视频有讲吗,我才看到第三章

输入:2  2进入缓冲区
输入:回车         '\n'进入缓冲区
赋值:b=2
此时缓冲区里还有个'\n'
就被赋给了c
scanf前加个fflush(stdin);(清空标准输入设备的缓冲区)就好了
或者用getch();读取一个字符来清除\n
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 19:24:59 | 显示全部楼层
本帖最后由 oggplay 于 2014-7-24 19:26 编辑

变通一下吧:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         double a,b;
  5.         char c;
  6.         printf("输入一个表达式,例如1.1+2.2:\n");
  7.         scanf("%lf %c %lf",&a,&c,&b);
  8.         
  9.         switch(c)
  10.         {
  11.         case '+':
  12.                 printf("%lf + %lf = %lf\n",a,b,a + b);
  13.                 break;
  14.         case '-':
  15.                 printf("%lf - %lf = %lf\n",a,b,a - b);
  16.                 break;
  17.         case '*':
  18.                 printf("%lf * %lf = %lf\n",a,b,a * b);
  19.                 break;
  20.         case '/':
  21.                 printf("%lf / %lf = %lf\n",a,b,a / b);
  22.                 break;
  23.         default:
  24.                 printf("error\n");
  25.         }
  26. }
复制代码



[\b]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-24 19:29:37 | 显示全部楼层

变通一下是可以,就是不知道错的原因,很纠结。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 19:37:43 | 显示全部楼层
哦!是这样的,在你将要输入字符的时候你按了一下回车,其实是把回车的字符'\n'输进去了,然后就执行错误的那个语句,我给你改了一下,你看一下:
  1. #include <stdio.h>

  2. void main()
  3. {
  4.         double a,b;
  5.         char c;
  6.         printf("please input a number:");
  7.         scanf("%lf",&a);
  8.         printf("please input another number:");
  9.         scanf("%lf",&b);
  10.         printf("please input the operational character:");

  11.         scanf("%c",&c);
  12.                 if(c == '\n')                //如果输入的是回车键的话
  13.                 {
  14.                         scanf("%c", &c);
  15.                 }
  16.                
  17.         switch(c)
  18.         {
  19.         case '+':
  20.                 printf("%lf + %lf = %lf\n",a,b,a + b);
  21.                 break;
  22.         case '-':
  23.                 printf("%lf - %lf = %lf\n",a,b,a - b);
  24.                 break;
  25.         case '*':
  26.                 printf("%lf * %lf = %lf\n",a,b,a * b);
  27.                 break;
  28.         case '/':
  29.                 printf("%lf / %lf = %lf\n",a,b,a / b);
  30.                                 break;
  31.                
  32.         default:
  33.                 printf("error\n");
  34.         }
  35. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 19:39:53 | 显示全部楼层
这是运行后的效果:

QQ截图20140724194009.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 19:42:38 | 显示全部楼层
本帖最后由 oggplay 于 2014-7-24 19:47 编辑
sliver_sky 发表于 2014-7-24 19:29
变通一下是可以,就是不知道错的原因,很纠结。。

你这个跟缓冲区有关,输入流需要刷新,比如scanf一个后记得试试fflush(stdin),但只限于windows下。如果你的stdio库里有fpurge函数,请用它替代fflush。
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         double a,b;
  5.         char c;
  6.         printf("please input a number:");
  7.         scanf("%lf",&a);
  8.         fpurge(stdin);
  9.         printf("please input another number:");
  10.         scanf("%lf",&b);
  11.         fpurge(stdin);
  12.         printf("please input the operational character:");
  13.         scanf("%c",&c);
  14.         fpurge(stdin);
  15.         switch(c)
  16.         {
  17.         case '+':
  18.                 printf("%lf + %lf = %lf\n",a,b,a + b);
  19.                 break;
  20.         case '-':
  21.                 printf("%lf - %lf = %lf\n",a,b,a - b);
  22.                 break;
  23.         case '*':
  24.                 printf("%lf * %lf = %lf\n",a,b,a * b);
  25.                 break;
  26.         case '/':
  27.                 printf("%lf / %lf = %lf\n",a,b,a / b);
  28.                 break;
  29.         default:
  30.                 printf("error\n");
  31.         }
  32. }
复制代码
抓图1.png
[\b]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 19:45:27 | 显示全部楼层
没清空缓存
输入完之后
加上
while((ch = getchar())!='\n');
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 20:40:48 | 显示全部楼层
你的c是个字符变量,当你输完另一个number之后按的那个回车键产生了一个换行符,直接赋给变量c,结果就变成错误了。清空缓冲区就好。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-24 22:03:18 | 显示全部楼层
青玄 发表于 2014-7-24 19:37
哦!是这样的,在你将要输入字符的时候你按了一下回车,其实是把回车的字符'\n'输进去了,然后就执行错误的 ...

原来回车键也能当成字符,长姿势了

点评

对啊! 你不知道吗!呵呵!  详情 回复 发表于 2014-7-24 22:04
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 22:04:10 | 显示全部楼层
sliver_sky 发表于 2014-7-24 22:03
原来回车键也能当成字符,长姿势了

对啊! 你不知道吗!呵呵! {:2_27:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-24 22:12:39 | 显示全部楼层
oggplay 发表于 2014-7-24 19:42
你这个跟缓冲区有关,输入流需要刷新,比如scanf一个后记得试试fflush(stdin),但只限于windows下。如果 ...

呀,还没学到这函数呢,做个笔记先
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-24 22:25:51 | 显示全部楼层
Nightnjl 发表于 2014-7-24 20:40
你的c是个字符变量,当你输完另一个number之后按的那个回车键产生了一个换行符,直接赋给变量c,结果就变成 ...

缓冲区。。。不太好理解啊,鱼c视频有讲吗,我才看到第三章
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 22:50:08 | 显示全部楼层
输入2后有个回车符,算作字符的,所以直接被读取了
也就是c='\n'
然后执行switch
自然报错了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 23:07:15 | 显示全部楼层
明显, 第二个输入数字时, 把你的回车读进去了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-24 23:08:42 | 显示全部楼层
绝尘の初 发表于 2014-7-24 22:53
输入:2  2进入缓冲区
输入:回车         '\n'进入缓冲区
赋值:b=2

输入1,回车,1进缓冲区,由于下一个是double型,回车不进缓冲区;
输入2,回车,2进缓冲区,由于下一个是char型,回车进缓冲区;
是这样的意思不?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-25 00:06:24 | 显示全部楼层
在scanf的下一行加个 getchar()来接收空格字符吧  比如
scanf("%lf",&a);  
getchar();
1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-25 09:01:14 | 显示全部楼层
我明白了,谢谢各位。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-26 22:28:52 | 显示全部楼层
函数 没学好吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-11 11:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表