You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言计算器输入运算符后Switch分支失效程序直接退出

C语言控制台计算器输入后直接退出问题修复

核心故障原因

程序运行到输入运算符步骤后直接退出的根因是scanf格式符使用错误:
你定义存储运算符的变量op是char字符类型,但读取时写的是scanf("%d", &op);——%d是整数读取占位符,当你输入小写字母时,scanf无法匹配整数格式,会直接匹配失败,既不会读取输入内容,也不会修改op变量的值。op始终保持初始值空格,无法匹配switch里的任何运算分支,直接走default分支执行完退出。

全量代码错误修复点

逐行排查后所有会导致运行异常的问题如下,按优先级排序:

  • 修复运算符读取逻辑:把scanf("%d", &op);改成scanf(" %c", &op);,%c是字符读取占位符,前面加空格是为了自动跳过输入缓冲区里残留的换行、空格等空白字符,避免读入无效字符。
  • 修复加法分支的scanf错误:加法分支读取第二个数的语句scanf("%d", "&d", &y);多传了无效参数,改成scanf("%d", &y);。
  • 删除重复变量定义:你在函数开头已经定义了sum/difference/product/quotient/sqrta/logarithm/exponent变量,各个case分支里声明变量时前面多写的int关键字全部删掉,避免重复定义编译报错。
  • 修复斜边计算分支的传参错误:该分支读取a、b值的scanf("%d", a);、scanf("%d", b);漏了取地址符&,改成scanf("%d", &a);、scanf("%d", &b);,scanf读取普通变量必须传入内存地址,否则会触发非法内存访问导致程序崩溃。
  • 修复计算结果的类型和输出格式错误:sqrt()/log()/pow()返回值都是double浮点数,你目前把结果存在int整型变量里会丢失精度,且printf输出时把格式符写在了字符串外面、用%d输出浮点数,会打印乱码。需要把存储这类计算结果的变量改成double类型,输出时把格式符放到引号字符串内,用%lf占位符输出浮点数,比如平方根的输出改成printf("\nSquare Root: %lf", sqrta);。
  • 补充边界判断:除法、平方根、对数分支增加合法值判断,避免除零、负数开方、非正数取对数这类操作触发运行时错误。

修正后的可运行代码

#include <stdio.h>
#include <math.h>
#include <Windows.h>

int main()
{
    int x;
    int y;
    char op = ' ';
    double sum;
    double difference;
    double product; 
    double quotient;
    double sqrta;
    double logarithm;
    double exponent;

    printf("**FxrMath**\n");
    printf("Options:\n");
    printf("(A)dd\n");
    printf("(S)ubtract\n");
    printf("(M)ultiply\n");
    printf("(D)ivide\n");
    printf("S(q)uare Root\n");
    printf("(L)ogarithm\n");
    printf("(P)ower (x^y)\n");
    printf("(H)ypotoneuse Calculator\n");
    printf("\n**OPERATOR MUST BE LOWERCASE**\n");
    printf("\nOperator: ");
    scanf(" %c", &op);

    switch (op)
    {
        case 'a':
            printf("First Number: ");
            scanf("%d", &x);
            printf("\nSecond Number: ");
            scanf("%d", &y);
            sum = x + y;
            printf("\nSum: %lf", sum);
            Sleep(2500);
            break;
    
        case 's':
            printf("First Number: ");
            scanf("%d", &x);
            printf("\nSecond Number: ");
            scanf("%d", &y);
            difference = x - y;
            printf("\nDifference: %lf", difference);
            Sleep(2500);
            break;

        case 'm':
            printf("First Number: ");
            scanf("%d", &x);
            printf("\nSecond Number: ");
            scanf("%d", &y);
            product = x * y;
            printf("\nProduct: %lf", product);
            Sleep(2500);
            break;
            
        case 'd':
            printf("First Number: ");
            scanf("%d", &x);
            printf("\nSecond Number: ");
            scanf("%d", &y);
            if (y == 0) {
                printf("\nError: Divide by zero!");
                break;
            }
            quotient = (double)x / y;
            printf("\nQuotient: %lf", quotient);
            Sleep(2500);
            break;
            
        case 'q':
            printf("Number: ");
            scanf("%d", &x);
            if (x < 0) {
                printf("\nError: Negative number has no real square root!");
                break;
            }
            sqrta = sqrt(x);
            printf("\nSquare Root: %lf", sqrta);
            Sleep(2500);
            break;
            
        case 'l':
            printf("First Number: ");
            scanf("%d", &x);
            if (x <= 0) {
                printf("\nError: Logarithm requires positive number!");
                break;
            }
            logarithm = log(x);
            printf("\nLogarithm: %lf", logarithm);
            Sleep(2500);
            break;
            
        case 'p':
            printf("First Number: ");
            scanf("%d", &x);
            printf("\nSecond Number: ");
            scanf("%d", &y);
            exponent = pow(x, y);
            printf("\nExponent: %lf", exponent);
            Sleep(2500);
            break;
            
        case 'h':
            int a;
            int b;
            printf("\nA: ");
            scanf("%d", &a);
            printf("\nB: ");
            scanf("%d", &b);
            double hypotenuse  = sqrt((double)(a*a) + (b*b));
            printf("\nHypotenuse: %lf", hypotenuse);
            Sleep(2500);
            break;
            
        default:
            printf("\nInvalid operator!");
            break;
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者King Ferrum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:18:18