学switch体时遇到的有关问题

学switch体时遇到的问题
本帖最后由 gblhack 于 2015-11-05 23:10:35 编辑
问题已经解决了,不好意思,新问题请见1、2楼

//一个计算器
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int system(const char *string); //清屏的函数声明,包含在stdlib.h
int main ()
{
    double a = 0, b = 0;
    long int long_a, long_b;
    char c ;
_calc:   //calc标签,用于计算完毕后跳转到此开始一个新的计算。

// 以下是计算器的部分,虽简陋但目前对于我来说没有问题,问题在结束switch之后
    printf("请输入一个加减乘除或取模的运算,在各元素之间加一个空格,例如:\n100 + 100\n");
    scanf("%lf %c %lf",&a, &c, &b);
    long_a = int(a); //转换成long int型
    long_b = int(b);
    switch(c)
    {
        case '+':
            system("cls"); //调用函数清屏
            printf("%lf %c %lf = %lf",a, c, b,a + b );
            break;
        case '-':
            system("cls"); 
            printf("%lf %c %lf = %lf",a, c, b,a - b );
            break;
        case '*':
            system("cls"); 
            printf("%lf %c %lf = %lf",a, c, b,a * b );
            break;
        case '/':
            if(b == 0) 
            {
                printf("除数不能为");
                break;
            }
            else if(a - long_a == 0 ) //这里用double型a减去强制转换成整数的a判断其是否为整数,如果为整数则输出的结果用整数商+余数的形式
            {
                system("cls"); 
                printf("\n%d %c %d = %d 余%d",long_a, c, long_b, long_a / long_b,long_a % long_b);
                break;
            }
            else 
            {
                system("cls"); 
                printf("%lf %c %lf = %lf",a, c, b,a / b );
                 break;
            }
        case '%':
            if(a - long_a == 0)// 因为只能是整数才能求余,故这里判断被除数是否为整数
            {
                if(b - long_b == 0 && b != 0)//判断除数是否为整数和是否为0
                {
                    system("cls");
                    printf("%d %c %d = %d",long_a, c, long_b,long_a % long_b );
                    break;
                }
                else printf("求余时除数不能为浮点数也不可为");
                break;
            }
                
            else printf("被除数不能为浮点数");
            break;            
        default:
            break;
    }
  //问题在下面!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    printf("\n返回请按y,退出请按其他任意键\n"); //这里运算完毕后提示用户输入y跳转到计算入口开始新的计算
    scanf("%c",&c); 
//把用户输入的字符存入变量c,问题就在这里,我调试时发现这一句根本就不会执行,
//或者是执行了但不会把输入的字符存入变量c ,而且下面不管是什么语句"一概都不执行“,
//为什么这样说呢,是因为就算在下面加一个输出语句也不会输出,直接闪退,而我是加了getch();的。
    if (c == 'y' || c == 'Y') 
    {
        system("cls");
        goto _calc;
    }
    else 
        exit;
    getch();
    return 0 ;
}


如果把上面的69、73、74行语句改成
 printf("\n返回请按1,退出请按其他任意键\n");
    scanf("%d",&long_a);
    if (long_a == 1)

但有时候会陷入死循环,去掉else exit;就不会。死循环的问题可能不在我现在探究的范围内,就是想知道为什么做了以上更改程序就可以"正常'了。

另外先说一下,如果问题和goto无关就不说goto的事,虽然很多人说不要使用goto,但学习到这里了,循环还没有学就先用goto。这个程序的错误可能也确实不在goto,因为就算把63行到getch();这中间的语句换成一个普通的输出语句也不行。
------解决思路----------------------
因为有getch(),需要吸收一个回车
------解决思路----------------------
exit;

不是一个函数调用,你可能要用
exit(0);

以获得预期效果
------解决思路----------------------
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];


------解决思路----------------------
万一你getchar()前,用户刚输入了<Tab>,<Enter>两个按键呢?