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

如何在C语言的每个case语句末尾实现程序重复执行?

解决Switch执行后重复程序的问题

看起来你卡在了让程序执行完功能后重复运行的环节,我帮你梳理下问题所在,然后给出修复后的代码。

首先,你的代码里几个关键问题:

  • 第一个版本的case 1里直接用了return 0;,这会直接终止程序,根本没机会询问用户是否继续。
  • 第二个版本的do-while循环条件写了opcao = !0,这是赋值操作(把1赋值给opcao),不是判断条件,会导致无限循环。
  • continuando()函数里的字符读取有问题:之前的scanf("%d", &opcao)会留下换行符在输入缓冲区,后续的scanf("%c")会直接读取这个换行,而不是用户输入的s或n。
  • 函数里的system("CLS")只是清屏,但没有回到主菜单重新让用户选择功能,流程断了。

修复后的完整代码

#include <locale.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h> // 要包含这个才能用exit()

// 函数返回1表示继续,0表示退出
int continuando() {
    char continuar;
    // 先吃掉输入缓冲区里的残留换行符,避免读取错误
    while ((getchar()) != '\n');
    
    printf("\n\nQuer continuar? (s/n): ");
    scanf("%c", &continuar);
    
    switch (continuar) {
        case 's':
        case 'S': // 支持大写S,更友好
            system("CLS");
            return 1; // 返回1告诉主程序继续运行
        case 'n':
        case 'N':
            printf("\nPrograma finalizado.");
            return 0; // 返回0告诉主程序退出
        default:
            printf("Opção inválida! Tente novamente.\n");
            return continuando(); // 递归调用,直到用户输入正确选项
    }
}

int main() { // main要返回int,标准写法
    setlocale(LC_ALL, "Portuguese");
    int keep_running = 1; // 控制主循环的变量
    int i, opcao, vetor1[10];
    float soma = 0.0, media;

    do {
        // 重置变量,比如soma每次重新运行都要清零
        soma = 0.0;
        
        // 显示主菜单
        printf("Digite um valor de 1 a 5:\n");
        printf("1-Média de valores\n");
        printf("2- Reverter vetor\n");
        printf("3- Separar os pares dos ímpares\n");
        printf("4- Subtração e o seu quadrado\n");
        printf("5- Novos valores e média \n");
        printf("Opção: ");
        scanf("%d", &opcao);

        switch (opcao) {
            case 1:
                printf("Introduza 10 números entre 1 e 100:\n");
                for (i = 0; i < 10; i++) {
                    do {
                        printf("Insira o dígito nº%d: ", i + 1);
                        scanf("%d", &vetor1[i]);
                        // 注意:这里不要在do-while里累加soma!否则如果用户输入错误,会重复加错误值
                    } while (vetor1[i] < 1 || vetor1[i] > 100);
                    soma += vetor1[i]; // 正确的位置:输入有效后再累加
                }
                media = soma / 10;
                printf("Média = %.2f\n", media);
                // 询问是否继续,根据返回值设置keep_running
                keep_running = continuando();
                break;
            case 2:
                printf("Código da função Reverter vetor\n");
                keep_running = continuando();
                break;
            case 3:
                printf("Código da função Separar pares e ímpares\n");
                keep_running = continuando();
                break;
            case 4:
                printf("Código da função Subtração e quadrado\n");
                keep_running = continuando();
                break;
            case 5:
                printf("Código da função Novos valores e média\n");
                keep_running = continuando();
                break;
            default:
                printf("Valor inválido! Escolha entre 1 e 5.\n");
                // 输入错误时,不询问继续,直接回到菜单
                keep_running = 1;
                break;
        }
    } while (keep_running); // 当keep_running为1时循环,0时退出

    return 0;
}

关键修改点说明

  • 主循环结构:用do-while(keep_running)包裹整个程序逻辑,keep_running变量由continuando()函数的返回值控制,流程清晰可控。
  • 输入缓冲区处理:在continuando()开头用while ((getchar()) != '\n');清空输入缓冲区,彻底解决读取字符时的换行符干扰问题。
  • 变量重置:每次循环开始时重置soma为0,避免多次运行时累加之前的旧值。
  • 移除错误的return:去掉case里的return 0;,改用keep_running控制程序退出,保证流程完整。
  • 函数返回值优化:让continuando()返回int类型,直接告诉主程序是否继续,比用exit()更灵活,也符合程序流程控制的最佳实践。
  • 输入累加修正:把soma += vetor1[i]移到do-while循环外面,避免用户输入错误值时重复累加错误数据。

这样修改后,程序就能在每个case执行完成后询问用户是否继续,选择s就回到主菜单重新选择功能,选择n就退出程序,完全符合你的需求。

内容的提问来源于stack exchange,提问作者tomas turbando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:54:31