2013-08-05 33 views
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 

回答

1

你還沒有在你的結構初始化字符串。請記住,char * name是字符串的指針,而不是字符串本身。與其他字符串相同。在32位應用程序中,char *的大小實際上是4個字節。這意味着你的整個結構是16字節(3 * 4字節指針+ 1 4字節浮點數)。

您需要爲您的字符串分配空間並將其分配給您的結構,然後才能嘗試從文件數據填充它們。否則,你的結構將指向堆中指針名稱*上的任何垃圾作爲你的字符串的地址。

編輯:

嘗試分配你的字符串一些空間:

stuPtr->名=(的char *)malloc的(128 *的sizeof(字符));

這將創建一個足夠容納127個字符的字符串。對其他字符串也一樣。

+0

我沒有分配指針與該線'stuPtr =(學生*)malloc的(的sizeof(學生)),以結構;' – bluebk

+0

是的,但指針在結構中的字符串不被初始化。這意味着它們將包含垃圾,而不是字符串可以存在的空間的地址。嘗試上面提到的編輯。 – tHand

+0

您還需要爲文件中的每次讀取分配一個新的學生結構,否則您將覆蓋最後一個結構。 – tHand

1

自從我使用過使用過的C之後的很長一段時間,但事實上您沒有爲STUDENT元素分配空間。

當你聲明 //結構

​​

您要爲16個字節(假設4點字節的指針和浮點)宣佈空間。

現在當創建爲STUDENT時,每個指針名稱,市場和初始值都有未定義的值。他們指向隨機空間 - 如果你非常幸運,他們被初始化爲空值。

學生一個更好的定義是

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

凡MAXS將被前面添加定義。

另一種方法是隻創建後分配空間

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]是相同的。

希望這會有所幫助。

安德魯

+1

我個人喜歡這種方法(使用MAX_NAME_SIZE),因爲在刪除結構之前,您不必擔心刪除字符串。當然你的結構會消耗更多的內存。 – tHand