2014-03-28 105 views
-2

我正在写一个c文件,它从一个.csv文件中获取信息,解析它,然后删除任何被解析的信息。我遇到的问题是,在运行.csv文件的一行后,我得到了分段错误。我听说我可以使用GDB来帮助解决这个问题,但我不知道如何使用它。这是我的.c文件分段错误,解析,C

void parser(int argc, char ** argv) 
{ 
FILE * songList; 
char * theString; 
char * theToken; 
char songs[ROOM_STRING_LENGTH]; 
char artist[ROOM_STRING_LENGTH]; 
char title[ROOM_STRING_LENGTH]; 
int x; 
int length; 
double size; 
char * type; 
char songType[1]; 
char songTypeC; 
MusicRec * next; 

theToken = ""; 


songList = fopen(argv[1], "r"); 

if(songList == NULL)/*returns an error if file wasnt opened*/ 
{ 
    printf("error opening file\n"); 
} 

else 
{ 
    while(fgets(songs, ROOM_STRING_LENGTH, songList) != NULL)/*gets one string at a time until fgets equals NULL*/ 
    { 
     theString = malloc((sizeof(char)*(strlen(songs)+1))); /* mallocs some memory*/ 
     strcpy(theString, songs); 
     x = 0; 
     for(theToken = strtok(theString, ","); theToken; theToken = strtok(NULL, ",")) 
     { 
      switch(x) 
      { 
       case 0: 
       strcpy(artist, theToken); 
       printf("%s\n", artist); 
       break; 

       case 1: 
       strcpy(title, theToken); 
       printf("%s\n", title); 
       break; 

       case 2: 
       sscanf(theToken, "%d",&length); 
       printf("%d\n", length); 
       break; 

       case 3: 
       size = atof(theToken); 
       printf("%.2f\n", size); 
       break; 

       case 4: 
       type = malloc(sizeof(char)); 
       sscanf(theToken, "%s",type); 
       songType[0] = *type; 
       songTypeC = songType[0]; 
       printf("%c\n", songTypeC); 
       free(type); 
       break; 
      } 
      x++; 

     } 
     next = malloc(sizeof(MusicRec)); 
     next = createRecord(title, artist, size, length, songTypeC); 
     /*print = printRecord(toPrint);*/ 
     destroyRecord(next); 
     /*free(print);*/ 
     free(next); 
    } 

free(theString); 
free(theToken); 
fclose(songList); 

} 
} 

这些被称为2个功能:

case 4: 
    type = malloc(sizeof(char)); 
    sscanf(theToken, "%s",type); 

你分配一个1:

char * printRecord(MusicRec * toPrint) 
{ 
char token[ROOM_STRING_LENGTH]; 
char * pointer; 

sprintf(token, "%s (%s):%d[%.2f]", toPrint->title, toPrint->artist, toPrint->lengthInSeconds, toPrint->sizeInKB); 
pointer = malloc(sizeof(char)*strlen(token)); 
strcpy(pointer, token); 
return(pointer); 
} 


void destroyRecord(MusicRec * theRecord) 
{ 
free(theRecord->title); 
free(theRecord->artist); 
} 
+0

您可能想阅读[GDB用户手册](https://sourceware.org/gdb/current/onlinedocs/gdb/)。简而言之,使用调试信息('-g'标志到GCC)构建你的程序,并用你的程序启动'gdb'。在GDB中运行你的程序,可能带有参数。发生崩溃时GDB将停止,并让您使用'bt'命令检查函数调用堆栈,并使用'up'命令遍历调用堆栈。如果GDB不停止在你的代码中,那么就直接进入堆栈,直到你进入你的代码。您可以“打印”变量值。 –

+0

至少你应该在调试器中运行你的程序,并编辑你的问题以包含调用堆栈(当它崩溃时,'bt'命令的输出)。 –

+1

顺便说一下,你必须记住,C中的字符串实际上是一个字符,而不是'strlen',即终止的'\ 0'字符所报告的字符。你在几个地方想念这个。 –

回答

0

在这段代码看看字节串并读入一个任意长度的字符串。 如果输入令牌大于1,则容易出现段错误。

+0

我将(sizeof(char))更改为(sizeof(char)* MAX_LENGTH),并且我仍然是seg错误 – destroted