C语言计算器程序Else If语句未正确执行仅触发错误分支
问题原因分析
- 运算符读取语句
scanf("%ch",&op);存在两处致命错误:- 格式符误用:C语言中读取单个字符的格式控制符是
%c,多余的h会导致scanf匹配规则异常,无法正确读取输入的运算符 - 输入缓冲区残留问题:前两次调用
scanf读取浮点数时,按下的回车键会在输入缓冲区留下一个换行符\n,如果直接用%c读取会优先拿到这个换行符,自然无法匹配+ - * /的判断条件
- 格式符误用:C语言中读取单个字符的格式控制符是
- 缺少合法程序入口:
#include<stdio.h>之后直接写代码块不符合C语言语法规范,必须显式声明main函数作为程序入口
修复后可正常运行的代码
#include<stdio.h> int main(void) { float no1, no2, ans; char op; printf("ENTER 1ST NUMBER:\n"); scanf("%f",&no1); printf("ENTER 2ND NUMBER:\n"); scanf("%f",&no2); printf("ENTER A BASIC MATHEMATICAL OPERATOR:\n"); // %c前加空格用于跳过所有前置空白字符(换行、空格等) scanf(" %c",&op); if(op=='+') { ans = no1 + no2; }else if(op=='-') { ans = no1 - no2; }else if(op=='*') { ans = no1 * no2; }else if(op=='/') { // 额外增加除数为0判断,避免运行异常 if(no2 == 0) { printf("DIVISION BY ZERO IS NOT ALLOWED!!\n"); return 1; } ans = no1 / no2; }else { printf("INVALID OPERATOR!!\n"); return 1; } printf("ANSWER=%.2f\n", ans); return 0; }
修复说明
- 补全了
int main(void)作为程序合法入口 - 将
scanf("%ch",&op);修改为scanf(" %c",&op);,%c前的空格会自动跳过输入缓冲区中残留的所有空白字符,确保读取到的是用户输入的运算符 - 新增了异常分支的提前返回逻辑,避免未初始化的
ans变量输出垃圾值 - 可选增加了除数为0的判断逻辑,避免除以0的运行时异常
内容的提问来源于stack exchange,提问作者Styx
相关产品推荐
相关产品推荐

