嘿伙计们我正在接受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循环只打印正确的第一行,并在第二行打印出错误。
任何想法为什么?
感谢。
答案 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指针。