File io 将文本文件读入二叉树,但出现运行时错误
当我试图将数据从输入文件读取到二叉树时,addStu函数中出现运行时错误,格式或指针使用是否有任何问题 这是我读取文件的代码:File io 将文本文件读入二叉树,但出现运行时错误,file-io,structure,binary-search-tree,File Io,Structure,Binary Search Tree,当我试图将数据从输入文件读取到二叉树时,addStu函数中出现运行时错误,格式或指针使用是否有任何问题 这是我读取文件的代码: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include "BST_ADT.h" // Structure typedef struct { char* name; char* market; cha
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "BST_ADT.h"
// Structure
typedef struct
{
char* name;
char* market;
char* initial;
float stock;
}STUDENT;
// Prototype Delarations
void addStu (BST_TREE* list);
//void deleteStu (BST_TREE* list);
//void findStu (BST_TREE* list);
//void printList (BST_TREE* list);
//int compareStu (void* stu1, void* stu2);
//void processStu (void* dataPtr);
int main (void)
{
// Local Definitions
BST_TREE* list;
// Statements
list = BST_Create(compareStu);
addStu(list);
deleteStu(list);
findStu (list);
printList(list);
return 0;
}
/*===================== addStu =========================*/
void addStu (BST_TREE* list)
{
// Local Declarations
STUDENT* stuPtr;
FILE* fp;
char fileName[25];
char buffer [100];
// Statements
stuPtr = (STUDENT*)malloc (sizeof (STUDENT));
printf("Enter the file name: ");
gets(fileName);
fp = fopen(fileName, "r");
if(fp == NULL)
{
printf("Error cannot open the file!\n");
exit(101);
}
while(fgets(buffer, 100, fp) != NULL)
{
if (!stuPtr)
printf("MEmory overflow!\n"), exit(101);
sscanf(buffer, "%s %s %s %f", stuPtr->name, stuPtr->market, stuPtr->initial, &(stuPtr->stock));;
} // end while
BST_Insert(list, stuPtr);
} //addStu
您尚未初始化结构中的字符串。请记住,char*name是指向字符串的指针,而不是字符串本身。其他字符串也一样。在32位应用程序中,char*的大小实际上是4个字节。这意味着您的整个结构是16字节(3*4字节指针+1 4字节浮点) 在尝试从文件数据填充字符串之前,需要为字符串分配空间并将其分配给结构。否则,您的结构将指向堆中指针名*处作为字符串地址的垃圾 编辑: 尝试为字符串分配一些空间: stuPtr->name=(char*)malloc(128*sizeof(char))
这将创建一个足以容纳127个字符的字符串。对其他字符串也要这样做。自从我使用C以来,已经有很长很长时间了,但是您没有为STUDENT元素分配空间这一事实让我大吃一惊 当你申报时 //结构
typedef struct
{
char* name;
char* market;
char* initial;
float stock;
}STUDENT;
您正在为16个字节声明空间(假设有4个字节的指针和浮点数)
现在,当作为学生创建时,每个指针name、market和initial都有未定义的值。它们指向随机空间——如果你很幸运的话,它们被初始化为空
对学生更好的定义是
typedef struct
{
char name[MAX_NAME_SIZE];
char market[MAX_MARKET_SIZE];
char initial[MAX_INITIAL_SIZE];
float stock;
}STUDENT;
其中定义了要在前面添加的最大值
另一种选择是在创建之后分配空间
stuPtr = (STUDENT*)malloc (sizeof (STUDENT));
stuPtr->name = (char *)malloc(MAX_NAME_SIZE);
stuPtr->market = (char *)malloc(MAX_MARKET_SIZE);
stuPtr->initial = (char *)malloc(MAX_INITIAL_SIZE);
数组名称是指向数组第一个元素的指针,因此名称和名称[0]是相同的
希望这有帮助
Andrew我确实用这行代码分配了指向结构的指针
stuPtr=(STUDENT*)malloc(sizeof(STUDENT))代码>是,但指向结构中字符串的指针未初始化。这意味着它们将包含垃圾邮件,而不是字符串所在空间的地址。尝试上面提到的编辑。您还需要为文件中的每次读取分配一个新的学生结构,否则您将覆盖上一个结构。我个人喜欢这种方法(使用MAX_NAME_SIZE),因为在删除结构之前,您不必担心删除字符串。当然,您的结构将消耗更多内存。
stuPtr = (STUDENT*)malloc (sizeof (STUDENT));
stuPtr->name = (char *)malloc(MAX_NAME_SIZE);
stuPtr->market = (char *)malloc(MAX_MARKET_SIZE);
stuPtr->initial = (char *)malloc(MAX_INITIAL_SIZE);