2016-01-20 7 views
0

Я хочу посмотреть, какой у ученика лучшая отметка в классе. Так что я сделать это, но я не знаю, где я неправильноСбой программы при чтении первой точки данных

struct Date { 
    char name[31]; 
    float mark; 
}; 

struct Date * Read(unsigned int n,struct Date *d){ 

    int i; 

    for(i=0;i<n;i++){ 
     getchar(); 
     fgets(d[i].name, 31, stdin); 
     scanf("%f",d[i].mark); 

    } 
    return d; 


} 

int main(){ 

    unsigned int n; 
    struct Date *d; 

    scanf("%u",&n); 
    d = (struct Date*) malloc(n*sizeof(struct Date)); 
    d=Read(n,d); 


    free(date); 

    return 0; 
} 

после того, как я прочитал отметку аварии программы. Может кто-нибудь помочь мне и объяснить, что изменить? Большое спасибо.

+2

'scanf ("% f ", d [i] .mark);' -> 'scanf ("% f ", & d [i] .mark);', 'free (date);' -> 'free (d);' – BLUEPIXY

+0

Научитесь хорошо форматировать свой код. Все, с кем вы работаете, будут благодарны вам за это. Пример: 'for (i = 0; i Almo

+0

Обычные подсказки: скомпилируйте все предупреждения и информацию об отладке ('gcc -Wall -Wextra -g'), затем ** используйте отладчик ** (' gdb') & [valgrind] (http://valgrind.org/). –

ответ

5

Катастрофа, скорее всего, из-за этого:

scanf("%f",d[i].mark); 

Вы должны пройти адрес в качестве аргумента, чтобы прочитать значение с плавающей точкой. Оно должно быть:

scanf("%f", &d[i].mark); 

Технически это undefined behaviour..

Компиляция с включенными предупреждениями. GCC предупреждает даже без каких-либо конкретных вариантов:

предупреждение: формат% F ожидает аргумент типа Afloat * A, но аргумент 2 имеет тип двойной [-Wformat =]
Scanf ("% F", D [I ].отметка);

Смежные вопросы