所以我有这个代码读取字符串并将它们应用到各自的结构成员中,但是一旦我进入读取int,我的程序崩溃并返回段错误。但是,如果我为变量赋值,然后将该值传递给结构,它可以正常工作。如果我为一个变量分配一个值,用scanf覆盖该值,然后将其传递给struct,它会再次发生段错误。
void createcompetitor() {
struct competitor *newcompetitor = malloc(sizeof (struct competitor));
if (newcompetitor == NULL)
return;
printf("Please enter the competitor's first name\n");
fgets(newcompetitor->firstname, 25, stdin);
printf(newcompetitor->firstname);
printf("Please enter the competitor's last name\n");
fgets(newcompetitor->lastname, 35, stdin);
printf(newcompetitor->lastname);
printf("Please enter the competitor's address\n");
fgets(newcompetitor->address, 105, stdin);
printf(newcompetitor->address);
printf("Please enter the competitor's age\n");
scanf("%d", &newcompetitor->phonenumber);
scanf("%c");
printf("%d", newcompetitor->age);
printf("Please enter the competitor's phone number\n");
scanf("%d", &newcompetitor->phonenumber);
scanf("%c");
printf("%d", newcompetitor->phonenumber);
printf("Please enter the competitor's registration number\n");
scanf("%d", &newcompetitor->competitornumber);
scanf("%c");
printf("%d", newcompetitor->competitornumber);
}
对于超级凌乱的代码感到抱歉,我只想弄清楚程序究竟发生了什么。
编辑: 结构定义是
struct competitor {
char firstname[20];
char lastname[30];
char address [100];
int age;
int phonenumber;
int competitornumber;
struct competitor *next;
};
答案 0 :(得分:3)
请注意不匹配
char firstname[20];
并且
fgets(newcompetitor->firstname, 25, stdin);
您允许写入数组边界之外,这是未定义的行为。
scanf("%c");
是另一个罪魁祸首。
scanf
从stdin读取输入并尝试将其写入为参数传递的地址,但您没有传递任何地址!
整个程序的行为未定义。感谢它只会崩溃。
如果您打算在继续之前等待用户交互,请以scnaf
的格式指定应该读取该字符,但不能在任何地方写入。像这样:
`scanf("%*c");`
然而,这是一个脆弱的等待用户互动"技术。所以记住这一点。
答案 1 :(得分:1)
您的段错很可能是由
引起的printf(newcompetitor->firstname);
printf()
应该像这样使用:
printf("%s\n", newcompetitor->firstname);
当且仅当您有一个没有变量的字符串文字时,您可以将它与一个参数一起使用,否则您需要同时提供format string
和正确数量的variable names
。