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

输入学生数量后scanf读取name自动跳过的问题解决咨询

解决scanf读取学生数量后跳过姓名输入的问题

在录入学生信息的C语言代码中,使用scanf输入学生数量后,后续读取姓名的scanf("%[^\n]")会直接跳过,进入学号输入环节;移除输入学生数量的scanf后代码可正常运行。推测原因是前一个scanf("%d")未读取输入后的换行符,该换行符被后续的%[^\n]格式语句读取,尝试过fgets和gets仍未解决。

问题代码如下:

#include <stdio.h>

int b;
int main()
{
    int a, c;
    printf("Enter the number of students\n");
    scanf("%d", &a);

    struct studinfo{
        char name[50];
        int roll;
        float marks;
    };

    struct studinfo s[10];

    for(int i = 0; i <= a; i++)
    {
        printf("Enter the Name :\n");
        scanf("%[^\n]s", s[i].name);      // 此处出现问题
        printf("\n");
        printf("Enter the roll no.\n");
        scanf("%d", &s[i].roll);
        printf("\n");
        printf("Enter the marks\n");
        scanf("%f", &s[i].marks);
    }

    for(int i = 0; i<= a; i++)
    {
            printf("Name: %s\n", s[i].name);
            printf("Roll no: %d\n", s[i].roll);
            printf("Marks: %f", s[i].marks);
    }
    return 0;
}

解决方案

  • 清理输入缓冲区残留的换行符
    在读取学生数量的scanf("%d", &a);语句后,添加getchar();来吃掉输入数字后留下的换行符。或者修改读取姓名的scanf语句,在格式串前加一个空格:scanf(" %[^\n]", s[i].name);——空格会让scanf自动跳过所有空白字符(包括换行、空格、制表符),避免读取到残留的换行符。

  • 修正scanf格式串的错误
    原代码中scanf("%[^\n]s", s[i].name);多了一个多余的s,正确的格式应该是scanf("%[^\n]", s[i].name);,因为%[^\n]本身就定义了读取直到换行符的字符串规则,不需要额外加s。

  • 修正循环条件避免数组越界
    原代码中循环条件i <= a会导致处理a+1个学生(比如输入a=2,循环执行0、1、2三次),而数组s只定义了10个元素,若a>=10会直接越界崩溃。应该改为i < a,确保只处理a个学生。

  • 如果用fgets替代scanf读取姓名
    使用fgets读取姓名后,需要手动去除末尾的换行符,示例代码:

    fgets(s[i].name, sizeof(s[i].name), stdin);
    // 去掉换行符
    s[i].name[strcspn(s[i].name, "\n")] = '\0';
    

    注意使用fgets前同样需要清理缓冲区的残留换行符,否则fgets会直接读取到空行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:00:38