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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:57:16