请教各位大大一个指针问题,有关strtok函数的。

爱喝旺仔的黑皮 2018-01-26 09:24:50
各位大佬,小弟写代码时遇到了一个需要分割数据包的问题,由于数据包是根据逗号分段的,且一个数据包需要多次取其中不同的内容,小弟用strtok函数时,由于该函数的使用会改变原有的字符串数组,我的项目不允许这样,所以我就自己写了个新函数,先把数据包的内容做个备份,再用备份来进行数据包切割,但问题是最后返回的值(也就是变量obj)永远无法打印出来,全都是“烫烫烫”。请问各位大大,哪地方的指针写错了呢??





char* split(char *buf, int pos, char *token)
{
char *hehe;
char *content;
char backup[100];
memcpy(backup, buf, 20);//备份要数据包
content = strtok_s(backup, token,&hehe);//使用备份数据包进行切割
for (int i = 0; i < (pos-1); i++)
{
content = strtok_s(NULL, token, &hehe);
}
return content;
}

int main()
{
char string_test[] = "no,yes,love,you";
char *obj = split(string_test, 3, ",");
printf("%s\n",obj);//打印出来永远是“烫烫烫”!
}
...全文
335 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-01-27
  • 打赏
  • 举报
回复
这是一个返回局部地址内容的操作,当split函数调用结束后,backup会被自动释放,那么你返回backup中的一个子串是没有意义的,也是未定义的行为; 建议这样操作;
char* split(char *buf, int pos, char *token, char *substr)
{
    char *hehe;
    char *content;
    char backup[100];
    memcpy(backup, buf, 20);
    content = strtok_s(backup, token,&hehe);
    for (int i = 0; i < (pos-1); i++)
    {
        content = strtok_s(NULL, token, &hehe);
    }
    memcpy(substr, backup, strlen(backup) + 1);
    //printf("%s\n", backup);

    return substr;
}

int main()
{
    char string_test[] = "no,yes,love,you";
    char substr[32];
    char *obj = split(string_test, 3, ",", substr);
    printf("%s\n", obj);

    return 0;
}
这只是其中一种方法,如果有更好的,建议采纳更好的
paschen 2018-01-27
  • 打赏
  • 举报
回复
幻夢之葉 2018-01-27
  • 打赏
  • 举报
回复
content每次返回的是下一次字符串的首地址,因为分隔符被替换为/0了。最后一个分割,content会指向字符串的最末位置的下一位置,就是无效字符串 还有你既然分割字符串,那肯定是很多个子串,你单单返回一个字符串是什么作用?

69,378

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧