C语言 - 结构

问题描述 投票:0回答:1

当执行第二个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;

}
c file-io structure
1个回答
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);
© www.soinside.com 2019 - 2024. All rights reserved.