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

C语言嵌套if条件异常求助:birth变量逻辑执行错误

问题分析与修复方案

问题根源

你的代码核心问题是处理birth年份的判断逻辑没有嵌套到「age为奇数」的分支里。不管age是偶数还是奇数,程序执行完age的判断后,都会自动跑到birth的判断语句。当age是偶数时,你根本没让用户输入birth,此时birth变量是未初始化的垃圾值,用它判断奇偶既不符合作业逻辑,还会触发未定义行为。

修复后的代码

#include <stdio.h>
#include <string.h>

int main() {
    char name[100];
    int age, birth;

    printf("Enter name: ");
    // 修正scanf格式:去掉多余的s,数组名无需取地址,加空格跳过前导空白(包括换行)
    scanf(" %[^\n]", name);
    
    int size = strlen(name);
    int last = size - 1;
    
    // 同时处理大小写元音,避免输入大写姓名时逻辑失效
    char last_char = name[last];
    if (last_char == 'a' || last_char == 'e' || last_char == 'i' ||
        last_char == 'o' || last_char == 'u' ||
        last_char == 'A' || last_char == 'E' || last_char == 'I' ||
        last_char == 'O' || last_char == 'U') {
        printf("Enter age: ");
        scanf("%d", &age); 
        
        if (age % 2 == 0) {
            printf("Wow, you're special!\n");
        } else {
            printf("Enter birth year: ");
            scanf("%d", &birth);
            // 把birth的判断移到该分支内,确保只有输入birth后才执行判断
            if (birth % 2 != 0) {
                printf("You will be special next year.\n");
            } else {
               printf("Oh, you're still special!\n");
            }
        }
    } else {
        printf("You're awesome!\n");
    }

    return 0;
}

关键修改点

  1. 调整逻辑嵌套:将birth的判断代码完全放到age % 2 != 0的else分支内部,确保只有当用户输入birth年份后,才会执行对应的奇偶判断和输出,严格贴合作业要求的流程。
  2. 修正scanf读取姓名的问题:
    • 原代码scanf("%[^\n]s", &name);格式错误,%[^\n]已是完整格式说明符,无需额外加s;
    • 数组名name本身就是指向首元素的指针,不需要用&取地址;
    • 格式符前加空格" %[^\n]",可跳过输入缓冲区残留的换行符,避免后续读取age时出现异常。
  3. 适配大小写输入:增加对大写元音字母的判断,避免用户输入大写姓名时逻辑失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:59:19