我编写了一个简单的C代码,希望用户输入学生的详细信息。但是它没有按预期工作,并且问题出在fgets
和scanf
中。这是我的代码:
#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);
}
}
问题在于此代码不接受学生的成绩。 请帮我这个!!
答案 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
或其他函数来解析字符串。
直接的解决方案是显式使用换行符或刷新输入缓冲区。