我正在尝试在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()
引起分段错误?
编译并运行该程序并检查行为:
#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, ":");
}
atoi()
不会导致段错误。 strtok
是,因为您要传递一个空指针。您需要检查atoi
是否返回空指针,如果是,则退出循环,而不仅仅是盲目地将其交给strtok
。