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

C语言计算器scanf函数如何实现用户仅按Enter键无输入时程序退出

问题原因

你当前使用的scanf("%d %c %d", ...)格式控制符会自动跳过所有前置空白字符(包含换行符、空格、制表符),因此用户直接按下Enter输入空行时,scanf会持续阻塞等待有效数值输入,无法检测到空输入的场景。

解决思路

调整输入读取逻辑,先整行读取用户输入,先判断输入是否为空行,再从读取的行内容中解析运算参数:

  1. 用fgets读取整行输入到缓冲区
  2. 若缓冲区仅包含换行符,判定为空输入,直接结束程序
  3. 用sscanf从缓冲区解析运算数和运算符,判断解析是否成功

修改后完整代码

#include <stdio.h>
int main(){
    int a, b;
    char choice;
    char buf[100]; // 输入缓冲区,存储整行输入内容
    while(1){
        printf("Enter your input: ");
        // 读取整行输入
        fgets(buf, sizeof(buf), stdin);
        // 判断是否为仅按回车的空输入
        if (buf[0] == '\n') {
            printf("检测到空输入,程序退出。\n");
            return 0;
        }
        // 从缓冲区解析参数,返回值为成功解析的参数个数
        int parse_cnt = sscanf(buf, "%d %c %d", &a, &choice, &b);
        if (parse_cnt != 3) {
            printf("输入格式错误,程序退出。\n");
            return 0;
        }
        switch(choice){
            case '+':
                printf("%d %c %d = %d", a, choice, b, a+b);
                break;
            case '-':
                printf("%d %c %d = %d", a, choice, b, a-b);
                break;
            case '*':
                printf("%d %c %d = %d", a, choice, b, a*b);
                break;
            case '/':
                if (b == 0) {
                    printf("除数不能为0,程序退出。\n");
                    return 0;
                }
                printf("%d %c %d = %d", a, choice, b, a/b);
                break;
            default:
                printf("Error calculating! Exiting.\n");
                return 0;
                break;
        }
        printf("\n");
    }
    return 0;
}

关键修改说明

  • 新增长度为100的字符数组作为输入缓冲区,满足普通运算输入的长度需求
  • 空输入判断逻辑:fgets会将用户输入的换行符一起存入缓冲区,因此如果缓冲区第一个字符就是换行符,说明用户没有输入任何有效内容仅按了回车
  • 用sscanf替代原scanf从缓冲区解析内容,通过返回值判断输入格式是否合法,避免非法输入导致程序异常
  • 新增除数为0的判断逻辑,优化程序鲁棒性

内容的提问来源于stack exchange,提问作者2hexed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:06:10