为什么不接受输入?代码被编译但跳过gets
。请帮助我,我是c的初学者。
当我在main中使用gets
函数时,它可以很好地工作。
但是当我在add()
中使用它时,它不起作用。背后的原因可能是什么。
void add()
{
int a,y,found;
printf("enter roll number");
scanf("%d",&a);
y=0;
while(y<=numberOfRecords)
{
if(a==s[numberOfRecords].rollNumber)
{
found=1;
break;
}
else
{
found=0;
}
y++;
}
if(found==1)
{
printf("this roll number have been assigned to %c",s[numberOfRecords].name);
}
else
{
s[numberOfRecords].rollNumber=a;
printf("enter name of student\n");
gets(s[numberOfRecords].name);
printf("student added\n");
numberOfRecords++;
}
}
答案 0 :(得分:1)
首先要做的事情 - 永远不要使用gets
。 将在您的程序中引入故障点。它已在C99中弃用,并已从该语言的C2011版本中删除。请改用fgets
。
关于实际问题,它源于在同一代码中混合scanf
和gets
。输入像5
这样的滚动编号时,输入流包含字符序列{'5', '\n'}
。 scanf
函数使用5
,但在输入流中保留换行符。
然后,当您输入"joe"
之类的名称时,输入流包含字符序列{'\n', 'j', 'o', 'e', '\n'}
。当gets
读取流时,它看到的第一个字符是滚动输入数留下的换行符,导致它立即返回而不再读取任何文本。
有两种解决此问题的方法。您可以在getchar
电话后添加scanf
来电(丑陋),也可以使用scanf
转化说明符而不是%s
电话使用gets
将跳过任何领先的空白区域:
printf("enter name of student\n");
scanf("%s", s[numberOfRecords].name);
但是,为了安全起见,您应该在%s
转换说明符上使用明确的大小,以防止scanf
读取的字符大于name
的大小。因此,如果name
可以容纳80个字符,请使用
scanf( "%79s", s[numberOfRecords].name ); // leave 1 for the 0 terminator