使用fgets和scanf进行输入时出现问题

时间:2019-07-29 03:40:42

标签: c fgets

我编写了一个简单的C代码,希望用户输入学生的详细信息。但是它没有按预期工作,并且问题出在fgetsscanf中。这是我的代码:

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

struct student{
    char name[80];
    int rollno;
    float marks[3];
    float avg;
};

int main()
{
    struct student stud[3];

    printf("Enter details of three students:");
    for(int i=0;i<3;++i)
    {
        printf("\nEnter name:");
        fgets(stud[i].name,80,stdin);
        printf("Enter rollno:");
        scanf("%d",&stud[i].rollno);
        printf("Enter marks of three subjects:");
        scanf("%f%f%f",&stud[i].marks[0],&stud[i].marks[1],&stud[i].marks[2]);
    }

    printf("\nThe details of three students are:\n");
    for(int i=0;i<3;++i)
    {
        printf("\nName of student:");
        fputs(stud[i].name,stdout);
        printf("\n");
        printf("\nRollno is:");
        printf("%d",stud[i].rollno);
        printf("\nMarks of three subjects are:");
        printf("%f %f %f",stud[i].marks[0],stud[i].marks[1],stud[i].marks[2]);
        stud[i].avg=(float)(stud[i].marks[0]+stud[i].marks[1]+stud[i].marks[2])/3;
        printf("\nThe average is:");
        printf("%f",stud[i].avg);
    }
}

问题在于此代码不接受学生的成绩。 请帮我这个!!

1 个答案:

答案 0 :(得分:4)

您在使用行缓冲区时遇到了问题。

setTimeout不直接从STDIN读取;它从其内部缓冲区读取。只有缓冲区为空,它将从STDIN读取一行以填充它。

scanf将注意到缓冲区为空,然后向STDIN询问一行。您输入例如scanf("%f%f%f", ...)并按Enter。内部缓冲区现在包含3.1 1.3 4.5"3.1 1.3 4.5\n"消耗了所需的内容-不需要换行符。这意味着缓冲区仍然包含scanf。下次当有人问STDIN时,缓冲区仍然不为空,因此无需要求用户提供进一步的信息:"\n"接收剩余的fgets(stud[i].name,80,stdin)

最好的建议是不要使用"\n",除非您确切地知道自己在做什么。使用scanf只会为您提供整个行缓冲区(如果在长度内),并使用fgets或其他函数来解析字符串。

直接的解决方案是显式使用换行符或刷新输入缓冲区。