C语言新手编写简易计算器出现scanf跳过输入问题求排查
问题排查与修复方案
1. 运算符输入被跳过的问题
原因:第一个scanf("%d", &n1)执行时,输入数字后按下的换行符\n会残留在输入缓冲区中。%c格式符不会自动跳过空白字符,所以第二个scanf("%c", &op)会直接读取缓冲区里的换行符作为op的值,不会等待用户手动输入。
修复方法:将读取运算符的代码修改为scanf(" %c", &op),格式符前加的空格会引导scanf自动忽略所有前置空白字符(换行、空格、制表符等),就能正常读取输入的运算符。
2. if/else判断逻辑错误
原因:所有判断分支中使用的是赋值运算符=,而非相等比较运算符==。if(op='+')的执行逻辑是把'+'赋值给op,再判断赋值结果是否为非0,结果永远为真,后续分支永远不会触发,哪怕输入的运算符不符合要求也会执行加法逻辑。
修复方法:将所有判断语句中的单等号替换为双等号==。
修正后完整代码
#include <stdio.h> int main() { int n1; int n2; char op; printf("insert first number: "); scanf("%d", &n1); printf("Insert operation (+, -, *, /): "); // 格式符前加空格跳过残留空白字符 scanf(" %c", &op); printf("insert second number: "); scanf("%d", &n2); // 全部替换为==做相等判断 if(op == '+') { printf("%d + %d = %d", n1, n2, n1+n2); } else if(op == '-') { printf("%d - %d = %d", n1, n2, n1-n2); } else if(op == '*') { printf("%d * %d = %d", n1, n2, n1*n2); } else if(op == '/') { // 补充除数为0的判断,避免运行异常 if(n2 == 0) { printf("error: divisor cannot be 0"); } else { printf("%d / %d = %d", n1, n2, n1/n2); } } else { printf("error [use +, -, *, /]"); } return 0; }
内容的提问来源于stack exchange,提问作者whookimo
相关产品推荐
相关产品推荐

