0

尝试将数据从输入文件读取到二叉树时,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

这是我的输入:

Microsoft Corporation;   NASDAQ MSFT    259.94B  
Yahoo! Inc.;         NASDAQ YHOO    37.67B  
Baidu.com, Inc. (ADR);   NASDAQ BIDU    8.64B  
CNET Networks, Inc.;     NASDAQ CNET    1.13B  
QuickLogic Corporation;  NASDAQ QUIK    88.62M  
Answers Corporation;     NASDAQ ANSW    53.49M  
Apple Inc.;              NASDAQ AAPL    114.17B  
EarthLink, Inc.;         NASDAQ ELNK    890.68M 
Amazon.com, Inc.;        NASDAQ AMZN    28.28B  
IAC/InterActiveCorp;     NASDAQ IACI    6.09B    
Time Warner Inc.;        NYSE   TWX 57.29B
4

2 回答 2

1

您还没有初始化结构中的字符串。请记住 char* 名称是指向字符串的指针,而不是字符串本身。与其他字符串相同。在 32 位应用程序中,char* 的大小实际上是 4 个字节。这意味着您的整个结构是 16 字节(3 * 4 字节指针 + 1 4 字节浮点数)。

您需要为字符串分配空间并将它们分配给您的结构,然后才能尝试从文件数据中填充它们。否则,您的结构将指向堆上指针 name* 处的任何垃圾作为字符串的地址。

编辑:

尝试为您的字符串分配一些空间:

stuPtr->name = (char*) malloc(128 * sizeof(char));

这将创建一个足以容纳 127 个字符的字符串。对其他字符串执行相同操作。

于 2013-08-05T23:41:12.473 回答
1

自从我使用 C 以来已经有很长一段时间了,但是您没有为 STUDENT 元素分配空间这一事实大声疾呼。

当你声明 // 结构

typedef struct
    {
        char* name;
        char* market;
        char*  initial;
        float stock;
    }STUDENT;

您正在声明 16 个字节的空间(假设 4 个字节的指针和浮点数)。

现在,每个指针名称、市场和初始值在创建为 STUDENT 时都有未定义的值。它们指向随机空间——如果你非常幸运,它们会被初始化为空值。

STUDENT 的更好定义是

typedef struct
    {
        char name[MAX_NAME_SIZE];
        char market[MAX_MARKET_SIZE];
        char  initial[MAX_INITIAL_SIZE];
        float stock;
    }STUDENT;

其中 MAX 被定义为较早添加。

另一种选择是在创建后分配空间

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

数组名是指向数组第一个元素的指针,所以 name 和 &name[0] 是一样的。

希望这可以帮助。

安德鲁

于 2013-08-05T23:54:47.730 回答