C язык - структура - PullRequest
       4

C язык - структура

0 голосов
/ 22 января 2019

При выполнении второго fscanf консоль перестает работать.Что я сделал не так?

Входной файл содержит:

3
minsu 50 80 40
sarah 30 60 40
jason 70 80 90

Код:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef struct studentT {
    char *name;
    int literature;
    int math;
    int science;
}studentT;

int main()
{
    studentT student[3];
    int count;
    char *inputFileName = malloc(sizeof(char)*30);
    char *outputFileName = malloc(sizeof(char) * 30);
    float avg;
    int i = 0;

    scanf("%s %s", inputFileName, outputFileName);

    FILE *fp = fopen(inputFileName, "r");

    if (fp == NULL)
    {
        printf("file is not exist");
        return 1;
    }

    fscanf(fp, "%d", &count);

    for (i = 0; i < (int)count; i++)
    {
        //printf("!");
        fscanf(fp, "%s %d %d %d", student[i].name, &student[i].literature, &student[i].math, &student[i].science);
        //printf("2");
        printf("%s %d %d %d\n", student[i].name, student[i].literature, student[i].math, student[i].science);
        //printf("333\n");
    }

    fclose(fp);
    free(inputFileName);
    free(outputFileName);
    return 0;

}

1 Ответ

0 голосов
/ 22 января 2019

Поле name в вашей структуре studentT является char *.Вы передаете этот указатель на scanf, ничего не инициализируя.Поэтому scanf читает неинициализированный указатель и пытается разыменовать его.Это вызывает неопределенное поведение.

Самый простой способ исправить это - изменить name на массив, достаточно большой, чтобы вместить любую ожидаемую строку.Затем вы можете записать в массив:

typedef struct studentT {
    char name[20];
    int literature;
    int math;    
    int science;
}studentT;

Альтернативно, вы можете использовать malloc для динамического выделения пространства:

student[i].name = malloc(20);
fscanf(fp, "%19s %d %d %d", student[i].name, &student[i].literature, 
                            &student[i].math, &student[i].science);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...