与strtok的Seg故障

时间:2013-03-23 03:38:18

标签: c linux segmentation-fault strtok

嘿伙计们我正在接受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]));
}

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

102910319    code    mark
.
.
.
104981851    code    mark

但是while循环只打印正确的第一行,并在第二行打印出错误。

任何想法为什么?

感谢。

3 个答案:

答案 0 :(得分:2)

数组索引问题。

你应该按如下方式声明指针数组,

char *token[3];

答案 1 :(得分:0)

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

此外,可能是你在某处提供的输入少于三个“单词”,其中%s将告诉printf打印由空指针指向的字符串,或者第二个{{ 1}}调用将尝试取消引用空指针。解决方案是在将atoi传递给printf之前检查token[1],然后在token[2]传递给atoi之前检查printf("%d:%s:%d", atoi(token[0]), token[1] ? token[1] : "null", token[2] ? atoi(token[2]) : 0);int x, y; char str[1024]; while (scanf("%d %1023s %d", &x, str, &y) == 3) { printf("%d:%s:%d\n", x, str, y); }

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

{{1}}

答案 2 :(得分:0)

你做到了

char *token[2]

它只能分配两个不是三个的char指针。