0

Visual Studio 2010 で記述された私の C プログラムは、未処理の 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;
}
4

1 に答える 1

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ます。

于 2012-04-16T06:24:44.827 に答える