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

问题描述 投票:0回答:2

我正在尝试在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.   */

}

我该如何摆脱这个错误?预先感谢。

c string pointers segmentation-fault
2个回答
3
投票

如何确定是strtok()引起分段错误?

编译并运行该程序并检查行为:

#include <stdlib.h>

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

来自strtok [已添加重点]

返回值

返回指向下一个标记的开头的指针,如果没有更多的标记,则返回NULL

看看这些陈述:

for ( j = 0; j < SIZE; j++) {
    pushLinkedList(&tmp->P, d);
    d= atoi(strtok(NULL, ":"));
    .....
    .....

如果SIZE大于<number of tokens> - 1的某个值,则strtok()将为n th次迭代返回NULL,其中n等于字符串中的<number of tokens>

因为您没有在发布的代码中显示SIZE的值,所以我认为它大于循环中处理的字符串中标记的数量。当strtok()找到给定字符串中的所有标记时,以后所有对strtok()的调用都将返回NULL指针,并且将此NULL指针传递给atoi(),这会导致分段错误。您应该检查strtok()返回值,仅在它不是atoi时才将其传递给NULL

您可以做:

int d;
char* line = arr[i];
char* tok = strtok(line, ":");
while (tok) {
    d = atoi(tok);
    pushLinkedList(&tmp->P, d);
    tok = strtok(NULL, ":");
}

附加:Why you should not use atoi()?


2
投票

atoi()不会导致段错误。 strtok是,因为您要传递一个空指针。您需要检查atoi是否返回空指针,如果是,则退出循环,而不仅仅是盲目地将其交给strtok

© www.soinside.com 2019 - 2024. All rights reserved.