结构 - 为什么与scanf相比,函数不起作用?

时间:2017-08-16 21:16:45

标签: c

得到(edu.classes [I]。学生[j]的。名称);

我想知道为什么编译器在调试后会跳过这一行并且不输入名称?以这种方式调用获取函数是否合法?

注意:一旦我使用scanf("%s",...) - 它就可以了!

的scanf("%S",edu.classes [I]。学生[j]的。名称);

(我知道我没有释放内存分配并检查分配是否失败 - 我知道这是必要的!它只是时间问题):)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SIZE 20

typedef struct
{
char name[SIZE];
int id;
}Student;

typedef struct
{
Student *students;
int num_students;
char teacher[SIZE];
}Class;

typedef struct
{
Class *classes;
int num_classes;
}Education;

int main()
{
int i, j;
Education edu;
puts("how many classes?");
scanf("%d", &(edu.num_classes));
edu.classes = (Class*)malloc((edu.num_classes) * sizeof(Class));
if (edu.classes == NULL)
{
    printf("ERROR allocation\n");
    exit(1);
}
for (i = 0; i < edu.num_classes; i++)
{
    puts("enter num of students");
    scanf("%d", &(edu.classes[i].num_students));
    edu.classes[i].students = (Student*)malloc((edu.classes[i].num_students) 
* sizeof(Student));
    for (j = 0; j < edu.classes[i].num_students; j++)
    {
        puts("enter student's name");
        gets(edu.classes[i].students[j].name); // this is the problematic line
        puts("enter id");
        scanf("%d", &(edu.classes[i].students[j].id));
    }
}
return 0;
}

1 个答案:

答案 0 :(得分:0)

我认为看到由于按下回车键而产生的换行符。 gets然后停止阅读。在gets看到之前尝试吃这些特殊字符。或者使用带有%s的scanf,当你看到它工作时,它会吃任何前导空格。