字符串在输入函数时消失

  • 本文关键字:消失 函数 字符串 c
  • 更新时间 :
  • 英文 :


我的任务是构建一个函数来构建一个学生数组,并使用链表保存一些值。任务是从一个txt文件中获取有关所述学生的一些信息,构建一个包含学生数组的大学结构类型,并将信息打印在一个新的txt文件上,现在学生字符串名称中的最大字符可以是99,但必须在给定名称长度后动态分配。所有其他变量,如整数值和字符,都被成功地移动了,但当所有变量都完成时,所有学生中的字符串名称就会消失(更改为"我一使用大学结构,字符串中的无效字符"(,进入不同的函数。

结构

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct stud
{
char* name;
int long ID;
float mtmGrade;
char gradesStr[6];
char approved;
struct stud* next;
}stud;
typedef struct uni
{
stud* studentsArray;
int studentNum;
}uni;
void studentInput(uni* university, stud* students, FILE* in);


void main()
{
FILE* in, * out;
uni* Uni = (uni*)malloc(sizeof(uni));
stud* students = NULL;
in = fopen("input.txt", "rt");
if (!in) Error_Msg("File not found!");
out = fopen("output.txt", "w");
if (!out) Error_Msg("File not found!");
Uni->studentsArray = (stud*)malloc(sizeof(stud));  // FREE THIS
studentInput(Uni, students, in);
fclose(in);
fclose(out);
}

功能

void studentInput(uni* university, stud* students, FILE* in)
{
stud* temp;
char maxName[99];
university->studentNum = 0;
while (feof(in) == 0)
{
university->studentsArray = (stud*)realloc(university->studentsArray, sizeof(stud));
university->studentNum++;
temp = (stud*)malloc(sizeof(stud));
// Name input //
fscanf(in, "%s", maxName);
temp->name = (char*)malloc((strlen(maxName) + 1) * sizeof(char));
if (!(temp->name)) Error_Msg("Not enough memory found");
temp->name = maxName;
// ID and matam grade input //
fscanf(in, "%d%f%s", &temp->ID, &temp->mtmGrade,temp->gradesStr);
temp->next = students;
students = temp;
}
university->studentsArray = students;
}

请注意maxName是函数studentInput中的局部变量,它仅在函数内部有效。之后:

temp->name = maxName;

temp->name将指向本地内存,在函数退出后可能会修改内容。

因此,您可以使用strcpy或strdup来代替:

void studentInput(uni* university, stud* students, FILE* in)
{
stud* temp;
char maxName[99];
university->studentNum = 0;
while (feof(in) == 0)
{
university->studentsArray = (stud*)realloc(university->studentsArray, sizeof(stud));
university->studentNum++;
temp = (stud*)malloc(sizeof(stud));
// Name input //
fscanf(in, "%s", maxName);
temp->name = strdup(maxName);
if (!(temp->name)) Error_Msg("Not enough memory found");
// ID and matam grade input //
fscanf(in, "%d%f%s", &temp->ID, &temp->mtmGrade,temp->gradesStr);
temp->next = students;
students = temp;
}
university->studentsArray = students;
}

p.S.

使用

int main()

比更符合C标准

void main()

最新更新