获取在Main中工作,但不在任何其他函数中工作

时间:2015-07-02 18:47:33

标签: c gets

为什么不接受输入?代码被编译但跳过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++;
    }

}

1 个答案:

答案 0 :(得分:1)

首先要做的事情 - 永远不要使用gets在您的程序中引入故障点。它已在C99中弃用,并已从该语言的C2011版本中删除。请改用fgets

关于实际问题,它源于在同一代码中混合scanfgets。输入像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