C 为什么strtok()会导致分段错误?

C 为什么strtok()会导致分段错误?,c,string,pointers,segmentation-fault,C,String,Pointers,Segmentation Fault,我正在尝试用c读取文件并将其存储在数组中。之后,我需要转换为与输入相关的整数。 但我有错。 当我寻找原因时,我意识到strtok导致了分割错误。我尝试了一些解决方案,但我做不到 我的输入文件如下所示: 1:2:3:4:5:6 6:5:4:3:2:1 我将它存储在数组中 注意:我需要按:字符将其拆分。每个项目都必须是数字 那么我的代码如下: char* line = arr[i]; int d = atoi(strtok(line, ":")); for ( j = 0; j < SIZE

我正在尝试用c读取文件并将其存储在数组中。之后,我需要转换为与输入相关的整数。 但我有错。 当我寻找原因时,我意识到strtok导致了分割错误。我尝试了一些解决方案,但我做不到

我的输入文件如下所示:

1:2:3:4:5:6
6:5:4:3:2:1
我将它存储在数组中

注意:我需要按:字符将其拆分。每个项目都必须是数字

那么我的代码如下:

char* line = arr[i];
int d = atoi(strtok(line, ":"));
for ( j = 0; j < SIZE; j++) {
    pushLinkedList(&tmp->P, d);
    d= atoi(strtok(NULL, ":"));  /* This part causes segmentation fault.   */

}
我怎样才能摆脱这个毛病?
提前感谢。

strtok不是SEG故障的原因。atoi是,因为您正在向它传递一个空指针。您需要检查strtok是否返回空指针,如果返回,则中断循环,而不是盲目地将其交给atoi。

您如何确定是strtok导致了分段错误

编译并运行此程序并检查其行为:

#include <stdlib.h>

int main(void) {
    atoi (NULL);
    return 0;
}
其他:

strtok不会在我的代码中返回空指针。但我不知道它为什么会导致。@YMG根据您向我们展示的代码,您无法知道strtok是否返回空指针。因此,声称strtok不返回空指针不是我们可以信任的。请提供一个。是的,这是对循环的一个很好的重写,尽管&tmp->P仍然没有定论,这可能是正确的,但可能是segfult的来源-没有MCVE无法判断。@DavidC.Rankin是的,&tmp->P可能是segfault的来源,但OP指出d=atoistrtokNULL,:语句是程序注释中segfault的原因。但是,当然,MCVE可以确定故障的原因。
for ( j = 0; j < SIZE; j++) {
    pushLinkedList(&tmp->P, d);
    d= atoi(strtok(NULL, ":"));
    .....
    .....
int d;
char* line = arr[i];
char* tok = strtok(line, ":");
while (tok) {
    d = atoi(tok);
    pushLinkedList(&tmp->P, d);
    tok = strtok(NULL, ":");
}