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
相关产品推荐
相关产品推荐

