C 获取结构的用户输入时出现问题

C 获取结构的用户输入时出现问题,c,struct,scanf,C,Struct,Scanf,我试图从用户那里获取结构中字符串的输入。但是,当尝试使用scanf获取输入时,显然有两个字符串存储在结构的第一个字符数组中。字符串的输入由空格分隔。这就是为什么我尝试使用scanf,因为我不知道是否可能使用fgets以空格分隔输入 我还尝试将结构成员更改为指向字符数组的指针,并使用malloc为字符串分配内存,但在输入后不断出现seg fault #define MAXID 6 #define FIRST_NAME_LENGTH 20 #define LAST_NAME_LENGTH 20

我试图从用户那里获取结构中字符串的输入。但是,当尝试使用scanf获取输入时,显然有两个字符串存储在结构的第一个字符数组中。字符串的输入由空格分隔。这就是为什么我尝试使用scanf,因为我不知道是否可能使用fgets以空格分隔输入

我还尝试将结构成员更改为指向字符数组的指针,并使用malloc为字符串分配内存,但在输入后不断出现seg fault

#define MAXID 6
#define FIRST_NAME_LENGTH  20
#define LAST_NAME_LENGTH   20

struct student
{
    char ID[MAXID];
    char f_name[FIRST_NAME_LENGTH];
    char s_name[LAST_NAME_LENGTH];
    int points[MAXROUNDS];
};

struct student studentinfo;

.......

void student_info(struct student *studentinfo)
{
    printf("Give the students ID, surname and firstname.\n");
    scanf("%s%s%s", studentinfo->ID, studentinfo->s_name, studentinfo->f_name);
}

printf("Info of the last student added: %s %s %s\n", studentinfo.ID, studentinfo.s_name, studentinfo.f_name);

因此,输入“666666 boi bobby”时,输出为“666666 bobby boi bobby”。怎么办?

ID
size如果为其输入6个字符,则之前保存在
f_name
的第一个字符中的空结尾字符将无法被bobby的“b”删除,因此,当您打印
ID
时,其中没有空字符,因此打印继续写入
f_name
生成66666666 bobby的内容,然后
s_name
打印生成boi,然后
f_name
打印(再次)生成bobby

输入66666而不是666666,或者增大ID的大小,该行为将消失


这就是为什么当您读取scanf

ID
大小为6的字符串时,必须使用保护以避免溢出。如果输入6个字符,则之前保存在
f_name
的第一个字符中的空结尾字符将被bobby的“b”删除,因此,当您打印
ID
时,其中没有空字符,因此打印继续写入
f_name
生成66666666 bobby的内容,然后
s_name
打印生成boi,然后
f_name
打印(再次)生成bobby

输入66666而不是666666,或者增大ID的大小,该行为将消失

这就是为什么在使用scanf读取字符串时必须使用保护以避免溢出