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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:36:03