我的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;
}
答案 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
后会发生什么?在 strtok
和insertNODE
之间添加对的检查。