File io 将文本文件读入二叉树,但出现运行时错误

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

当我试图将数据从输入文件读取到二叉树时,addStu函数中出现运行时错误,格式或指针使用是否有任何问题

这是我读取文件的代码:

#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);