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

编写10年级成绩单C程序时第四个scanf无法获取输入的问题

C语言scanf输入跳过问题解决

问题原因

读取整数的scanf("%d", &standard);执行完成后,用户输入的回车符会残留在输入缓冲区中。后续的scanf("%[^\n]%*c", section);中,%[^\n]规则是匹配除换行符之外的所有字符,此时缓冲区第一个字符就是换行符,导致匹配失败,scanf直接返回,表现为程序跳过了班级(section)的输入步骤。

解决方案

以下两种方法都能解决这个问题,方案2的适用性更强:

方案1:手动清除缓冲区的换行符

在读取standard的scanf语句后,添加getchar()来吃掉残留的换行符:

#include<stdio.h>
int main(){
    int subject, mathematics, english, hindi, science, socialScience;
    char school[50];
    char name[50];
    char section[5];
    int standard;
    int total;

    printf("\nPlease Enter your school name: ");
    scanf("%[^\n]%*c", school);

    printf("\nEnter student name: ");
    scanf("%[^\n]%*c", name);

    printf("\nenter standard: ");
    scanf("%d", &standard);
    getchar(); // 清除输入年级后残留的换行符

    printf("\nenter your section:");
    scanf("%[^\n]%*c", section);
    
    return 0;
}

方案2:通过格式串跳过空白字符

修改读取section的scanf格式串,在%[^\n]前添加一个空格。空格会自动跳过所有空白字符(包括换行、空格、制表符等),无需手动处理缓冲区:

#include<stdio.h>
int main(){
    int subject, mathematics, english, hindi, science, socialScience;
    char school[50];
    char name[50];
    char section[5];
    int standard;
    int total;

    printf("\nPlease Enter your school name: ");
    scanf("%[^\n]%*c", school);

    printf("\nEnter student name: ");
    scanf("%[^\n]%*c", name);

    printf("\nenter standard: ");
    scanf("%d", &standard);

    printf("\nenter your section:");
    scanf(" %[^\n]%*c", section); // 格式串前添加空格跳过空白
    
    return 0;
}

说明

方案2的鲁棒性更强,能够处理输入时的任意前置空白情况,推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:45:51