在Bellow C计划中,gets
无效,因此我使用scanf
从标准输入中获取学生姓名。
#include<stdio.h>
#include<string.h>
struct student
{
char name[10];
int roll, sub[6], total, age;
};
int take(int n, struct student s[])
{
int i, j;
for(i=0;i<n;i++)
{
s[i].total=0;
printf("\n\nEnter the name of the %d student :",i+1);
gets(s[i].name);//over here gets is not working
//scanf("%s",s[i].name);
printf("Roll no :");
scanf("%d",&s[i].roll);
printf("Enter your Age : ");
scanf("%d",&s[i].age);
for(j=0;j<6;j++)
{
printf("Enter the Marks of Subject %d : ",j+1);
scanf("%d",&s[i].sub[j]);
s[i].total=s[i].total+s[i].sub[j];
}
}
}
main()
{
int n;
struct student s[10];
printf("Enter how Student Details you want to Enter : ");
scanf("%d",&n);
take(n, s);
}
如何使用gets
?
答案 0 :(得分:1)
将scanf
与gets
或fgets
混合在新行处理方面可能会出现问题。
在致电gets
之前,您使用格式字符串scanf
致电"%d"
。这会覆盖任何前导空格,然后(松散地说)读取数字序列并在第一个非数字处停止。完成此调用后,输入缓冲区中会有一个换行符(以及您在数字后输入的任何非数字)。
当您再调用gets
时,它会读取并包含下一个换行符,换行符将被丢弃。这会导致空字符串被读入s[i].name
。
在调用gets
之前,您需要刷新输入缓冲区中的所有内容,包括下一个换行符。您可以使用getchar
循环执行此操作,如下所示:
int c;
while ((c=getchar()) != '\n' && c != EOF);
此外,您不应该使用gets
,因为它无法防止超出您的输入缓冲区,这可能导致未定义的行为。您应该使用fgets
代替:
fgets(&s[i].name, sizeof(s[i].name);
if (strrchr(s[i].name, '\n') != NULL) {
*strrchr(s[i].name, '\n') = 0;
}
如果有空格,fgets
函数将在读取字符串中包含换行符,因此以下语句将删除换行符(如果存在)。
答案 1 :(得分:0)
我已经找出可能导致问题的一些错误。
首先定义主要功能的返回类型(通常为int main()
)。
全局声明结构变量数组,因为它可能被限制为使用gets
来访问结构元素,因为它会面临安全问题(对它不太了解)。
您不能使用gets
,而只能使用scanf
来执行此操作。当以外行格式使用时,它会在第一个空白区域时停止输入。
以这种方式使用scanf
使其接受空格:
scanf("%[^\n]s",s[i].name);