获取不在c中工作

时间:2017-04-17 14:37:35

标签: c gets

在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

2 个答案:

答案 0 :(得分:1)

scanfgetsfgets混合在新行处理方面可能会出现问题。

在致电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);