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

C语言四则运算计算器如何实现按用户意愿重复执行功能

问题原因分析
  • 输入缓冲区残留换行符导致scanf("%c", &q)没有读取到用户实际输入的选择值:前面所有scanf读取数字、浮点数的时候,只会读取对应格式的内容,用户输入结束按下的回车产生的\n字符会残留在输入缓冲区。后续执行scanf("%c", &q)时,%c可以读取任何字符包括空白符,所以会直接把残留的\n读入变量q,根本不会等待用户输入y/n,自然无法触发继续执行的逻辑。
  • 递归调用main函数属于C语言未定义行为:C标准并没有允许主动调用main函数,这种写法依赖编译器实现,兼容性差,同时递归会额外占用栈空间,不是实现循环逻辑的合理方案,应该用循环结构替代。
修复方案
  1. 读取用户选择的字符前,先清空输入缓冲区的残留空白符,可以在scanf("%c", &q)的格式符前加一个空格,即scanf(" %c", &q),空格会让scanf自动跳过所有前置空白符,就能正常读取用户输入的y/n了。
  2. 把整个业务逻辑放到while(1)死循环里,当用户输入非y的选项时直接break跳出循环结束程序即可,不需要调用main。
  3. 额外补充优化:增加非法选项的判断逻辑,避免用户输入1-4之外的选项没有任何提示;除法运算增加除数为0的判断,避免除零错误。
修复后的完整代码
#include <stdio.h>
int main() {
    float a, b;
    int p;
    char q;
    while(1) { // 用循环实现重复执行
        printf("Enter the first number:");
        scanf("%f", &a);
        printf("Enter the second number:");
        scanf("%f", &b);
        printf("Choose the option:\n1.Sum\n2.Subtraction\n3.Multiplication\n4.Division\nyour choice=");
        scanf("%d", &p);
        switch (p)
        {
        case 1:
            printf("The sum of above numbers is: %f", a + b);
            break;
        case 2:
            printf("The subtraction of above numbers is:%f", a - b);
            break;
        case 3:
            printf("The multiplication of above numbers is:%f", a * b);
            break;
        case 4:
            if(b == 0) {
                printf("Error: divisor cannot be 0");
            } else {
                printf("The division of above numbers is:%f", a / b);
            }
            break;
        default:
            printf("Error: invalid option");
            break;
        }
        printf("\n\nDo u want to continue:(y for yes and n for no) :");
        // 格式符前加空格跳过缓冲区残留的空白符
        scanf(" %c", &q);
        if (q != 'y') { 
            break;
        }
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者how is this

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:57:02