您好我正在尝试制作一个简单的程序来检查学生评估是否大于5.50。当我尝试输入变量“类中的数字”时,我得到了SEGFAULThere是我的代码:
#include <stdio.h>
typedef struct student{
char name[100];
int number_in_class;
double assessment;
}student;
int main(void){
student corrective[25];
int i;
for(i = 0; i < 25; i++){
printf("Ime na uchenika:\n");
scanf("%s", corrective[i].name);
printf("Nomer v klas:\n");
scanf("%i", corrective[i].number_in_class);
printf("ocenka:\n");
scanf("%f", corrective[i].assessment);
}
for(i = 0; i < 25; i++){
if(corrective[i].assessment >= 5.50){
printf("Ime: %s\nNomer v klas: %i\nOcenka: %i\n",corrective[i].name, corrective[i].number_in_class ,corrective[i].assessment);
}
}
return 0;
}
知道为什么吗?
答案 0 :(得分:1)
使用%lf
来阅读double
个对象,而不是%i
或%f
。对于printf
,请使用%f
打印double
。您还需要传递scanf
个参数的指针。启用所有编译器警告并修复它们。
答案 1 :(得分:1)
您需要将对象的地址传递给scanf()
,而不是其值
for(i = 0; i < 25; i++){
printf("Ime na uchenika:\n");
scanf("%s", corrective[i].name); // array converted to pointer to 1st element (an address)
printf("Nomer v klas:\n");
scanf("%i", &corrective[i].number_in_class); // use & to pass the address
printf("ocenka:\n");
scanf("%lf", &popravitelni[i].assessment); // same as before
}
正如其他海报所述,对于"%lf"
类型的对象的地址,您需要double
。
答案 2 :(得分:1)
scanf()
的参数不正确。你必须将它们作为指针传递。
scanf("%s", corrective[i].name);
是正确的,因为corrective[i].name
是一个数组,因此是定义的指针,但是你不能对其他原始数据类型做同样的事情。然后转向&
以获取其指针。
...
scanf("%i", &corrective[i].number_in_class);
...
scanf("%f", &corrective[i].assessment);
此外,您应该检查您正在阅读的类型,如ouah's answer中所述。
答案 3 :(得分:0)
您在此声明中使用%i
:
scanf("%i", corrective[i].number_in_class);
而number_in_class是双倍的。使用%lf
,用于double
。同样在此声明中更正%f
到%lf
:
scanf("%f", popravitelni[i].assessment);
还可以使用&
- 地址运算符来传递scanf()
函数中的地址而不是值。
更正代码:
scanf("%lf", &corrective[i].number_in_class);
.
.
scanf("%lf", &popravitelni[i].assessment);