我正在尝试从用户那里获取结构中字符串的输入。但是,当尝试使用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”。怎么办?
答案 0 :(得分:2)
ID
的大小(如果为6),但是您输入了6个字符,则空位字符没有空间,该字符在被'b'删除之前已保存到f_name
的第一个字符中的 bobby ,因此当您打印ID
时,其中没有空字符,因此打印继续写入f_name
的内容,生成 666666bobby ,然后{ {1}}是产生 boi 的印刷品,然后s_name
是再次产生 bobby
输入66666而不是666666或增加 ID 的大小,该行为就会消失
这就是为什么在使用 scanf
读取字符串时必须使用保护措施以避免溢出的原因