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

求助:第二个scanf函数无法接收年龄输入的问题

问题分析与解决:第二个scanf无法接收整数输入

问题根源

你的代码中,第一个scanf("%c", &usrname);会读取输入中的单个字符,但输入完成后按下的**换行符(\n)**会残留在输入缓冲区中。当执行第二个scanf("%d", &age);时,若缓冲区中残留非数字字符(比如换行符或输入名字时多余的字符),会导致scanf无法正确识别整数输入,表现为程序看似“停止响应输入”。

另外,usrname是char类型,仅能存储单个字符,若输入多个字符(比如全名),多余字符也会留在缓冲区干扰后续读取。

解决方案

提供两种实用修复方式:

  1. 在第一个scanf的格式字符串前添加空格
    空格会让scanf自动跳过所有前导空白字符(包括换行符、空格、制表符等),确保读取到用户输入的有效字符:
int main() {

    int age;
    char usrname;
    
    printf("Hello, Welcome to the birth year calculator!");
    printf("\nEnter Your Name: ");
    scanf(" %c", &usrname); // 注意%c前的空格

    printf("Enter your age at the end of this year: ");
    scanf("%d", &age);

    return 0;
}
  1. 读取字符后手动清空缓冲区
    在第一个scanf之后,用getchar()吃掉残留的换行符:
int main() {

    int age;
    char usrname;
    
    printf("Hello, Welcome to the birth year calculator!");
    printf("\nEnter Your Name: ");
    scanf("%c", &usrname);
    getchar(); // 读取并丢弃缓冲区中的换行符

    printf("Enter your age at the end of this year: ");
    scanf("%d", &age);

    return 0;
}

额外建议

如果需要读取完整用户名(含多个字符),应将usrname定义为字符数组,比如char usrname[50];,再用scanf("%s", usrname);读取(%s会自动跳过前导空白,读取至下一个空白字符),或使用fgets读取包含空格的完整名字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:40:31