将令牌指针(来自 strtok)分配给结构的 2d VLA 的指针元素时出现段错误
Segfault when assigning token pointer (from strtok) to pointer element of 2d VLA of structs
我正在尝试解析 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++;
}
}
在此问题上停留了一段时间any/all 对输入表示赞赏和鼓励。
您没有检查第一个 strtok()
调用的 return 值。
此外,在您的 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++;
}
我正在尝试解析 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++;
}
}
在此问题上停留了一段时间any/all 对输入表示赞赏和鼓励。
您没有检查第一个 strtok()
调用的 return 值。
此外,在您的 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++;
}