gpt4 book ai didi

C语言-结构体

转载 作者:行者123 更新时间:2023-11-30 16:22:46 28 4
gpt4 key购买 nike

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

}

最佳答案

studentT 结构中的 name 字段是一个 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);

关于C语言-结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54300354/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com