我正在尝试解析 csv 文件并将这些值存储在 2d VLA 中。 第一个代码块显示了我对函数 TokenizeLine 的两次调用,该函数非常简单地使用 strtok 来分隔行并将 token 分配给数组中适当的单元格。第二个 block 是有问题的函数。
//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++;
}
在以下函数中,将 token 指针分配给 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++;
}
}
在这方面已经坚持了一段时间了,任何/所有的意见都受到赞赏和鼓励。
最佳答案
您没有检查第一个 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++;
}
关于c - 将 token 指针(来自 strtok)分配给结构的 2d VLA 的指针元素时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31254274/