我正在尝试解析csv文件并将这些值存储在2d VLA中。 第一个代码块显示了我对函数TokenizeLine的两个调用,它非常简单地使用strtok将行拆开并将令牌分配给数组中的相应单元。第二个块是有问题的功能。
//Get first line of file then iterate through lines until
//beginning comments are passed over
fgets(currentLineStr, 8192, fileIn);
while (currentLineStr[0] == '#')
fgets(currentLineStr, 8192, fileIn);
//Start adding values to array. current line held by currentLineStr
//is assigned first
TokenizeLine(currentLineStr, eTable, yIndex, x, y);
yIndex++;
while(fgets(currentLineStr, 8192, fileIn) != NULL)
{
TokenizeLine(currentLineStr, eTable, yIndex, x, y);
yIndex++;
}
在以下函数中,我将令牌指针分配给eTable结构中包含的指针时会出现段错误。
void TokenizeLine(int x; int y; char currentLineStr[], Entry eTable[x][y], int yIndex, int x, int y)
{
char *tokPtr;
int xIndex = 0;
tokPtr = strtok(currentLineStr, "|");
*** eTable[xIndex][yIndex].str = tokPtr;*** (error happening here)
while(tokPtr != NULL)
{
tokPtr = strtok(NULL, "|");
eTable[xIndex][yIndex].str = tokPtr;
//printf("%s\n", eTable[xIndex][yIndex].str);
xIndex++;
}
}
一直坚持这一点任何/所有输入赞赏和鼓励。
答案 0 :(得分:1)
您未检查第一次strtok()
来电的返回值。
此外,在while
循环中,检查tokPtr
是否为NULL,但在使用之前在循环体的第一行更新它。
您需要删除eTable[xIndex][yIndex].str
的初始设置,并将第二个strtok()
调用移至while
循环的末尾:
tokPtr = strtok(currentLineStr, "|");
while(tokPtr != NULL)
{
eTable[xIndex][yIndex].str = tokPtr;
//printf("%s\n", eTable[xIndex][yIndex].str);
tokPtr = strtok(NULL, "|");
xIndex++;
}