C编程,导致未处理的win32异常,可能在strlen函数中。

时间:2012-04-16 06:15:30

标签: c visual-studio-2010 unhandled-exception

我的c程序,在visual-studio 2010中编写,正在抛出未处理的win32异常。

我认为它基于调试器输出的strlen函数,但我不确定。 我读的文件是多行的;用作分隔符,错误似乎发生在我到达第一个链表的末尾,因此可能在readFile或insertNode中。

该文件的第一行是:

blah division;first department;second department

任何帮助将不胜感激。我在未处理的win32异常中搜索StackOverflow搜索的前几页,它们似乎与访问冲突或内存溢出问题有关

#define _CRT_SECURE_NO_WARNINGS 1
#define FLUSH while (getchar () != '\n')
#define DEFAULT "dept.txt"
#define LENGTH 50
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

//Structures
 typedef struct DEPT {
char * DeptName;
struct DEPT * link;  
} DEPT;

typedef struct {
char divisionName[LENGTH];
DEPT * first;
} DIVISION;

//Function Declarations
int ReadFile (DIVISION DivArr [], int * lastDiv);
FILE * getFileName (void); 
DEPT * insertNODE (DEPT * pList, char * string);

int main (void) {
//Local Declarations
//Create the array of the DIVISION Structure
DIVISION DivArr[20];
int i;
int lastDiv;
//Statements
//Read in File
if  (ReadFile (DivArr, &lastDiv)) {
    return 1;
}
for (i = 0; i < lastDiv; i++) {
    printf ("%s\n",DivArr[i].divisionName);
}
return 0;
}
/*==================================ReadFile==================================
Calls getFileName to get the file name to open, then reads the file's data into 
DivArr, parsing them appropriately, returning 1 if the file can't be opened */
int ReadFile (DIVISION DivArr [], int * lastDiv){
//Local Declarations
FILE * datafile;
char tempstring[300], *Ptoken;
int linenum = 0;
//Statements
datafile = getFileName();

//return from function with 1 if file can't be opened
//go through file line by line
while (fgets(tempstring, sizeof(tempstring), datafile)) {
    //tokenize string
    Ptoken = strtok (tempstring , ";");
    //first part of string is assigned to divisionName
    strncpy(DivArr[linenum].divisionName,  Ptoken, LENGTH - 1); 
    DivArr[linenum].first = NULL;

    //subsequent parts are assigned to linked list
    while(Ptoken) {
        Ptoken = strtok (NULL, ";\n");
        DivArr[linenum].first = insertNODE (DivArr[linenum].first, Ptoken);
    }
    linenum++;
}
*lastDiv = linenum;
fclose(datafile);
return 0;
} //ReadFile
/* =================================getFileName===============================
Gets input from the keyboard and if enter is pressed, returns default, otherwise                             returns specified filename */
FILE * getFileName (void){ 
//local declarations
int open = 1;
char read[LENGTH];
FILE * datafile = NULL;
//Statements
//open file
do{
    printf ("Enter a filename to open, or press enter for default:");
    fgets (read, LENGTH - 1, stdin);
    if ('\n' == read[0]) { 
        strncpy (read , DEFAULT, LENGTH - 1);
    }
    else
    read[strlen(read) - 1] = '\0';
    if((datafile  = fopen(read, "r")) == NULL)
        printf ("Error opening %s\n", read);
    else 
        open = 0;
} while (open == 1);
return datafile;
} //getFileName
/* =================================insertNODE================================
Gets the address of the beginning of the list for the structure, then
allocates memory for nodes, then allocates memory for string, then passes
string to allocated memory, then links node
*/
DEPT * insertNODE (DEPT * pList, char * string)
{
//Local Declarations
DEPT * pNew;
DEPT * pWalker = pList;
DEPT * pPre;
//Statements
if ( !(pNew = (DEPT*)malloc(sizeof(DEPT)))) 
        printf ("\nMemory overflow in insert\n"),
            exit (100);
printf ("size of string + null = %d\n",strlen(string) + 1);


    if(!(pNew->DeptName =(char*)calloc(strlen(string) + 1, sizeof(char))))
    {
        printf ("\nMemory overflow in string creation\n");
        exit (100);
    }
    strncpy(pNew->DeptName, string, strlen(string)); 
    printf("%s is %d long", pNew->DeptName, strlen(pNew->DeptName));

if (pWalker == NULL) //first node in list
{
    pNew->link = pList;
    pList = pNew;
}
else { 
    while (pWalker){
        pPre = pWalker;
        pWalker = pWalker->link;
    }
    pPre->link = pNew;
    pNew->link = NULL;
}
return pList;
}

1 个答案:

答案 0 :(得分:1)

此循环可能是您出错的原因:

//subsequent parts are assigned to linked list
while(Ptoken) {
    Ptoken = strtok (NULL, ";\n");
    DivArr[linenum].first = insertNODE (DivArr[linenum].first, Ptoken);
}

strtok返回NULL后会发生什么?在 strtokinsertNODE之间添加对的检查。