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

C语言年龄性别录入程序输出与输入不匹配问题排查

问题根因
  • 核心错误为性别输入的格式符误用:你定义的g是char类型变量,但使用了%s格式符调用scanf读取输入。%s是字符串专用格式符,读取内容后会自动在内存末尾追加\0作为字符串结束标记,char类型仅占1字节存储空间,额外写入的\0触发栈越界,恰好覆盖了相邻存储的int类型变量a的低地址字节,直接导致输入的年龄被意外修改为0。
  • 次要逻辑错误为年龄校验位置错位:当前代码是在完成年龄、性别两次输入之后才判断年龄是否小于0,若年龄非法跳回重输年龄,会出现性别已输入但年龄重新录入的逻辑冲突,且首次输入年龄合法时while循环不会生效,校验逻辑没有意义。
修复方案
  1. 将性别读取的scanf("%s", &g)改为scanf("%c", &g),匹配char类型的输入规则,避免内存越界。
  2. 将年龄校验逻辑移到年龄输入、读取缓冲区换行之后,性别输入流程之前,保证只有年龄合法才会进入性别录入环节。

修复后可正常运行的代码如下:

#include<stdio.h>

int main(){
    int a;
    char g;
    
    entry:
    printf("%s","AGE : ");
    scanf("%d", &a);
    getchar();
    // 年龄校验移至性别输入前
    if (a < 0){
        goto entry;
    }
    
    insert:    
    printf("%s","GENDER :");
    scanf("%c", &g);
    getchar(); 
    
    switch(g){
        case 'M':
            printf("I am a %d yr old male", a);
            break;
        case 'F':
            printf("I am a %d yr old female", a);
            break;
        default:
            goto insert;
            break;
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:39:04