关于strtok函数的问题

HelloCPPlus 2018-03-21 06:23:24
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

int main()
{
char a[] = "www.baidu.com";
char *p = strtok(a, ".");

while (p != NULL)
{
printf("%s\n",p);
p = strtok(NULL, ".");
}

system("pause");
return EXIT_SUCCESS;
}


代码总体还是很容易理解的,但是我就是有点搞不明白,while循环截取的时候,p=strtok(NULL,".") 这句话的意思。
p=strtok(a,".") 是在字符串a中以.来截取,那p=strtok(NULL,".") 这个该怎么理解呢?
...全文
310 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
仙剑老祖 2018-03-22
  • 打赏
  • 举报
回复
这要理解的话 ,涉及strtok函数的实现原理代码,你可以 理解p = strtok(NULL, "."); 为继续分割 第一次分割时在p后面追加,NULL 等到最后一次分割时while()遇到NULL后,结束循环
HelloCPPlus 2018-03-22
  • 打赏
  • 举报
回复
引用 3 楼 weixin_39587157 的回复:
这要理解的话 ,涉及strtok函数的实现原理代码,你可以 理解p = strtok(NULL, "."); 为继续分割 第一次分割时在p后面追加,NULL 等到最后一次分割时while()遇到NULL后,结束循环
通俗易懂
HelloCPPlus 2018-03-22
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:
strtok实现中,是会对即将要截取的字符串修改的,通常做法是对分割字符用\0替代,并记录某些状态 strtok(NULL, ".");会根据上一次的状态,再对剩余的子串分割 你可以看看你的编译器下对这个函数实现的源码 依据楼上的说法,这个函数不是线程安全的,因为一个线程可能对另一个线程的状态进行改写,也可能造成数据竞争或冲突
明白啦,谢谢啦
HelloCPPlus 2018-03-22
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
当第一个参数传递NULL时,则表示从剩余的字符串里找到子串,并将子串前的返回;strtok函数里会保存第一次调用之后(使用静态变量static保存)剩余的字符串的地址(或称为位置)。 个人建议使用strtok_r代替strtok,因为strtok_r函数是strtok函数的可重入版本,strtok_r是linux平台下的strtok函数的线程安全版。
 char *strtok_r(char *str, const char *delim, char **saveptr);
这个是strtok_r的原型,第三个参数saveptr就是上次调用之后剩余的字符串首地址。使用strtok_r可应该会更好理解字符串分割。
明白啦,谢谢啦
幻夢之葉 2018-03-21
  • 打赏
  • 举报
回复
strtok实现中,是会对即将要截取的字符串修改的,通常做法是对分割字符用\0替代,并记录某些状态 strtok(NULL, ".");会根据上一次的状态,再对剩余的子串分割 你可以看看你的编译器下对这个函数实现的源码 依据楼上的说法,这个函数不是线程安全的,因为一个线程可能对另一个线程的状态进行改写,也可能造成数据竞争或冲突
自信男孩 2018-03-21
  • 打赏
  • 举报
回复
当第一个参数传递NULL时,则表示从剩余的字符串里找到子串,并将子串前的返回;strtok函数里会保存第一次调用之后(使用静态变量static保存)剩余的字符串的地址(或称为位置)。 个人建议使用strtok_r代替strtok,因为strtok_r函数是strtok函数的可重入版本,strtok_r是linux平台下的strtok函数的线程安全版。
 char *strtok_r(char *str, const char *delim, char **saveptr);
这个是strtok_r的原型,第三个参数saveptr就是上次调用之后剩余的字符串首地址。使用strtok_r可应该会更好理解字符串分割。

69,371

社区成员

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

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