gpt4 book ai didi

c - 无法使用 fgets() 函数读取循环结构内的字符串

转载 作者:行者123 更新时间:2023-11-30 17:40:50 25 4
gpt4 key购买 nike

我还使用了 fgets()gets() 来获取字符串作为循环内的输入。第一次执行时,它工作正常,但在第二次执行时,它跳过输入步骤,直接进入下一行。

#include<stdio.h>
#include<conio.h>
struct student
{
int roll,m[3];
float avg;
char name[30];
}s[5];
void main()
{
int i;
clrscr();
printf("Enter thr student details:");
for(i=0;i<5;i++)
{
printf("\nstudent[%d] name:",i+1);
fgets(s[i].name,30,stdin);
printf("student[%d] register number: ",i+1);
scanf("%d",&s[i].roll);
printf("student[%d] marks:\n",i+1);
scanf("%d%d%d",&s[i].m[0],&s[i].m[1],&s[i].m[2]);
s[i].avg=(s[i].m[0]+s[i].m[1]+s[i].m[2])/3;
}
printf("-----------------------------------------------------------");
printf("\n NAME REG.NO AVERAGE");
printf("\n-----------------------------------------------------------");
printf("\n DISTINCTION");
for(i=0;i<5;i++)
if(s[i].avg>74)
printf("\n%-20s%-10d%.2f",s[i].name,s[i].roll,s[i].avg);
printf("\n FIRST CLASS");
for(i=0;i<5;i++)
if((s[i].avg<74)&&s[i].avg>50)
printf("\n%-20s%-10d%.2f",s[i].name,s[i].roll,s[i].avg);
printf("\n FAIL");
for(i=0;i<5;i++)
if(s[i].avg<50)
printf("\n%-20s%-10d%.2f",s[i].name,s[i].roll,s[i].avg);
getch();
}

最佳答案

Enter thr student details:
student[1] name:abcd <Enter>

fgets 读取直到达到大小限制或返回 EOF 或遇到新行 (\n) 字符。在上面的场景中,它读取 abcd 并读取 \n,然后返回。

student[1] register number:  12<Enter>
student[1] marks:
12 13 14<Enter>

现在,您正在使用 scanf 读取数字。带有 %dscanf 返回,直到遇到数字或看到 EOF。它忽略所有换行符。

经过上述两个步骤后,输入流中会剩下一个额外的 \n。(因为 scanf 实际上并没有读取它)。

现在,当您下次调用 fgets 时,首先已经有一个 \n 了。它返回那里,而不实际提示输入下一个名称。

解决方案:

读取标记后放置一个getch()。这将从流中删除前导 \n。或者,使用 scanf 本身读取名称。

scanf("%s", s[i].name);

关于c - 无法使用 fgets() 函数读取循环结构内的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21360806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com