[英]Segmentation fault on strtok_r
char buffer[1000];
recv(sock, buffer, sizeof(buffer), 0);
char *ptr;
printf("\n%s\n", buffer);
char searchPos[500];
sprintf(searchPos, "mercenary %d position", ID);
char *req = strstr(buffer, searchPos);
if(req != NULL)
{
char *token;
token = strtok_r(buffer, " ", &ptr);
token = strtok_r(ptr, " ", &ptr);
token = strtok_r(ptr, " ", &ptr);
token = strtok_r(ptr, " ", &ptr);
printf("%s\n",token);
}
我有这段代码在printf行上产生了分段错误,我不知道为什么。 缓冲区看起来像“雇佣2位置15 20”。 谁能帮我 ?
strtok_r(如果找到令牌),指向令牌开头的指针。 否则为null指针 。 当在要扫描的字符串中到达字符串的末尾(即,空字符)时,总是返回空指针 。
char buffer[1000];
// make sure all bytes are initialized to 0
memset(buffer, '\0', sizeof(buffer));
// make sure there is at least one byte left that's set to 0
if( recv(sock, buffer, sizeof(buffer) - 1, 0) == -1 ) {
perror("recv()");
exit(1);
}
recv
不会在字符串的末尾放置一个空终止符(而printf
%s
假定存在一个终止符)。
在少数地方,这可能会出错-我们不能仅告诉您哪里出了问题。
recv()
返回“ 接收到的字节数,如果发生错误,则返回-1 ”-您无法知道此处是否出错(除非您检查返回值)。 另外, recv()
不会nul终止“ string ”,因为据它所知/所关心的,它只是数据。
sprintf()
会写入缓冲区,而不管缓冲区有多长-除非可以保证有足够的空间,否则不要使用它。 请改用snprintf()
,它会考虑缓冲区的长度。 另外,检查返回值是否存在潜在问题。 但是,您的500x char
缓冲区确实看起来非常大。
我很高兴看到您使用的是strtok_r()
而不是strtok()
。 根据此无关的Linux(非C)参考资料 ,您使用的是错误的,但是使用它本身并不会真正引起问题 。
在第一次调用
strtok_r()
,str
应该指向要解析的字符串,而saveptr
的值将被忽略。 在后续调用中,str
应该为NULL ,而自上次调用以来,saveptr
应该保持不变。
strtok()
和strtok_r()
函数返回指向下一个标记的指针, 如果没有更多标记 , 则返回NULL 。
最后,由于以下问题之一, printf()
可能会导致SEGFAULT:
token
为NULL token
没有被nul终止,因此printf()
正在进入杂草。 我将赌注押在#1上,因为您应该在第一个printf("\\n%s\\n", buffer);
处看到SEGFAULT printf("\\n%s\\n", buffer);
除此以外。 我说“ 应该 ”是因为您可能很幸运-此时会打印“ 不可见 ”的垃圾。
我真的不知道怎么了。 我在另一个IDE中尝试过,它起作用了。 谢谢您的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.