再次执行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;
}
答案 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);