使用MinGW编写的C语言简易计算器输入运算符后意外退出问题
问题分析与解决方案
你的程序输入运算符后意外退出,大概率不是编译器问题,核心是两个未处理的隐患:
1. 未实际处理除零错误
你代码里注释了“Handle division by zero”但没做判断逻辑。当第二个输入数为0时,执行(double)number1 / number2会触发浮点数异常,直接导致程序崩溃退出。
修复方法:在除法分支前添加判断:
case '/': if (number2 == 0) { printf("Error: Division by zero is not allowed\n"); break; } result = (double)number1 / number2; printf("%.2lf / %.2lf = %.2lf\n", (double)number1, (double)number2, result); break;
2. getchar()的缓冲区处理有漏洞
你用getchar()吃掉换行,但如果用户输入数字后附带了其他字符(比如123 abc\n),scanf("%d")只会读取123,剩下的字符里getchar()只吃掉第一个,后续残留字符可能干扰输入逻辑(虽然后面scanf(" %c")的空格会跳过空白,但极端场景仍会出问题)。
更可靠的缓冲区清空方式是用循环吃掉所有字符直到换行:
// 替换原有的getchar() while ((getchar()) != '\n');
修改后的完整代码
#include <stdio.h> int main() { int number1, number2; double result; char op; printf("Enter the 1st number: v2 "); scanf("%d", &number1); while ((getchar()) != '\n'); // 清空输入缓冲区 printf("Enter the 2nd number: "); scanf("%d", &number2); while ((getchar()) != '\n'); // 清空输入缓冲区 printf("Enter an operator (+, -, *, or /) "); scanf(" %c", &op); switch (op) { case '+': result = number1 + number2; printf("%.2lf + %.2lf = %.2lf\n", (double)number1, (double)number2, result); break; case '-': result = number1 - number2; printf("%.2lf - %.2lf = %.2lf\n", (double)number1, (double)number2, result); break; case '/': if (number2 == 0) { printf("Error: Division by zero is not allowed\n"); break; } result = (double)number1 / number2; printf("%.2lf / %.2lf = %.2lf\n", (double)number1, (double)number2, result); break; case '*': result = (double)number1 * number2; printf("%.2lf * %.2lf = %.2lf\n", (double)number1, (double)number2, result); break; default: printf("Invalid operator\n"); break; } return 0; }
额外建议
编译时启用警告选项,比如执行gcc -Wall -Wextra calculator.c -o calculator,能帮你发现更多潜在问题——比如之前直接用%.2lf打印int类型变量,虽能运行但会触发编译器警告,显式转换为double更规范。
内容的提问来源于stack exchange,提问作者mati
相关产品推荐
相关产品推荐

