0

嘿伙计们,我遇到了 strtok 的段错误,只需要一点帮助!

char s[1024];
char *token[2];
while(fgets(s, sizeof(s), fp) != NULL) // Read line from file fp until end
{
    token[0] = strtok(s, "\t\n");
    token[1] = strtok(NULL, "\t\n");
    token[2] = strtok(NULL, "\t\n");
    printf("%d:%s:%d", atoi(token[0]), token[1], atoi(token[2]));
}

但是在循环的第一次逾越节后我得到了一个段错误。输入文件内容如下:

102910319    code    mark
.
.
.
104981851    code    mark

但是 while 循环仅正确打印第一行并在第二行上显示段错误。

任何想法为什么?

谢谢。

4

3 回答 3

2

数组索引问题。

您应该如下声明指针数组,

char *token[3];
于 2013-03-23T03:45:22.163 回答
0

正如杰克所说,令牌被声明为存储两个char *s:token[0]token[1]token[2]超出范围。解决方案是更改您的令牌声明:char *token[3];

此外,可能是您在某处提供了少于三个“单词”的输入,其中%s将告诉 printf 打印由空指针指向的字符串,或者第二次atoi调用将尝试取消引用空指针。token[1]解决方案是在将其传递给 printf 之前进行检查,然后再将其token[2]传递给atoiprintf("%d:%s:%d", atoi(token[0]), token[1] ? token[1] : "null", token[2] ? atoi(token[2]) : 0);

或者,看起来 scanf 可能更适合这个:

int x, y;
char str[1024];
while (scanf("%d %1023s %d", &x, str, &y) == 3) {
    printf("%d:%s:%d\n", x, str, y);
}
于 2013-03-23T03:56:43.157 回答
0

你来做

char *token[2]

它只能分配两个字符指针而不是三个。

于 2013-03-23T14:02:32.377 回答