C语言while循环内if语句执行后程序终止问题求助
问题分析与修复
你的程序输入正确答案后直接终止,无法执行询问重试的逻辑,根源在于以下几个代码问题:
1. 多余的break语句导致提前退出循环
- 处理题目时,内层循环里无论答案对错都有
break,会直接跳出题目循环;更关键的是,外层if (quizNumber == quizNumber)(这个条件永远为真)后的break,会直接跳出最外层的while(loop == 'y')循环,程序根本走不到询问是否继续的代码段。 - 解决方案:去掉外层多余的
break,调整内层break逻辑——仅在答对题目时跳出循环,答错则让用户继续尝试。
2. 未初始化变量引发未定义行为
score变量未初始化,while (score != 5)的条件是不确定的,可能导致程序逻辑异常。解决方案:初始化score = 0,且每次进入测验循环时重置分数。
3. scanf读取字符时的缓冲区残留问题
用户输入答案后按回车,换行符会留在输入缓冲区,后续scanf("%c", &loop)会直接读取这个换行符,导致loop被设为换行,程序直接退出循环。解决方案:读取loop时添加空格跳过空白字符,即scanf(" %c", &loop)。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { srand(time(0)); int luckyNumber; int quizNumber; int score = 0; // 初始化分数变量 int totalScore; int averageScore; int attempts; char answer1; char answer2; char answer3; char opt1; char loop = 'y'; printf("Welcome to the quiz program!\n"); while(loop == 'y') { score = 0; // 每次测验重置分数 printf("Please enter a lucky number between 1 and 9: "); scanf("%d", &luckyNumber); quizNumber = rand() % 3 + 1; printf("Your quiz number is %d\n", quizNumber); // 处理测验1的逻辑,后续可扩展测验2、3的分支 if (quizNumber == 1) { while (score != 5) { printf("Quiz 1\n"); printf("A. True\n"); printf("B. False\n"); printf("Enter your answer: "); scanf(" %c", &answer1); if (answer1 == 'B' || answer1 == 'b') { printf("Correct!\n"); score += 5; break; // 答对才跳出题目循环 } else { printf("Incorrect!, Try again.\n"); printf("\n"); // 答错不退出,让用户继续尝试 } } } // 此处可添加quizNumber为2、3的题目处理逻辑 printf("Would you like to go again y/n? "); scanf(" %c", &loop); // 跳过缓冲区残留的换行符 if (loop != 'y' && loop != 'Y') { loop = 'n'; } } return 0; }
额外说明
原代码中if (quizNumber == quizNumber)是永远成立的无效判断,已替换为quizNumber == 1作为示例,你可以在此基础上补充测验2和测验3的对应逻辑。
内容的提问来源于stack exchange,提问作者delv
相关产品推荐
相关产品推荐

