获取用户输入的结构问题

时间:2019-04-19 21:35:58

标签: c struct scanf

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

我还尝试过将结构成员更改为指向字符数组的指针,并使用malloc为字符串分配内存,但是在输入后始终会出现seg错误。

#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”,输出为“ 666666bobby boi bobby”。怎么办?

1 个答案:

答案 0 :(得分:2)

ID的大小(如果为6),但是您输入了6个字符,则空位字符没有空间,该字符在被'b'删除之前已保存到f_name的第一个字符中的 bobby ,因此当您打印ID时,其中没有空字符,因此打印继续写入f_name的内容,生成 666666bobby ,然后{ {1}}是产生 boi 的印刷品,然后s_name是再次产生 bobby

的印刷品

输入66666而不是666666或增加 ID 的大小,该行为就会消失

这就是为什么在使用 scanf

读取字符串时必须使用保护措施以避免溢出的原因