如何在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
相关产品推荐
相关产品推荐

