-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);
}
您可能想阅读[GDB用户手册](https://sourceware.org/gdb/current/onlinedocs/gdb/)。简而言之,使用调试信息('-g'标志到GCC)构建你的程序,并用你的程序启动'gdb'。在GDB中运行你的程序,可能带有参数。发生崩溃时GDB将停止,并让您使用'bt'命令检查函数调用堆栈,并使用'up'命令遍历调用堆栈。如果GDB不停止在你的代码中,那么就直接进入堆栈,直到你进入你的代码。您可以“打印”变量值。 –
至少你应该在调试器中运行你的程序,并编辑你的问题以包含调用堆栈(当它崩溃时,'bt'命令的输出)。 –
顺便说一下,你必须记住,C中的字符串实际上是一个字符,而不是'strlen',即终止的'\ 0'字符所报告的字符。你在几个地方想念这个。 –