C中结构的分段错误

时间:2014-03-16 16:57:29

标签: c struct

您好我正在尝试制作一个简单的程序来检查学生评估是否大于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;
}

知道为什么吗?

4 个答案:

答案 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);