首页 > 解决方案 > C语言——结构

问题描述

执行 secondfscanf时,控制台停止工作。我做错什么了?

输入文件包含:

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;

}

标签: cfile-iostructure

解决方案


结构中的name字段studentTchar *. 您将该指针传递给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);

推荐阅读