C语言-结构

时间:2019-01-22 02:18:31

标签: c file-io structure

再次执行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 :(得分:0)

您的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);