You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C语言strtok()函数传入NULL参数的技术问询

解析strtok(NULL, s)的执行逻辑

strtok是个带内部状态的字符串分词函数,这就是它允许传入NULL的核心原因,具体逻辑拆解如下:

第一次调用strtok(str, s)

当你第一次传入目标字符串str和分隔符s时:

  • 函数会从str的起始位置开始,跳过开头的分隔符(如果有的话),找到第一个非分隔符的字符作为token的起点。
  • 然后继续向后扫描,直到遇到下一个分隔符,把这个分隔符替换成\0(这样当前token就变成了一个以\0结尾的独立字符串)。
  • 最后返回指向这个token的指针,同时在内部用静态变量记住当前处理到的位置(也就是刚才替换的分隔符的下一个字符)。

后续调用strtok(NULL, s)

当第一个参数传NULL时,strtok不会重新处理新的字符串,而是直接读取之前保存的内部位置,从那里继续执行分词逻辑:

  • 从上次停止的位置开始,重复「跳过分隔符→找token起点→找下一个分隔符替换成\0→返回token指针」的流程。
  • 当扫描到字符串末尾,找不到更多有效token时,函数返回NULL,循环终止。

结合你的代码实例

你的代码里,原字符串是"This is - www.tutorialspoint.com - website",分隔符是'-':

  1. 第一次调用strtok(str, s)后,第一个'-'被替换成\0,返回的token是"This is ",内部保存的位置是第一个'-'后面的空格。
  2. 第二次调用strtok(NULL, s)时,从这个空格开始扫描,跳过空格(因为空格不是分隔符),找到"www.tutorialspoint.com "作为第二个token,把第二个'-'替换成\0,保存位置到第二个'-'后面的空格。
  3. 第三次调用strtok(NULL, s),扫描到" website"作为第三个token,保存位置到字符串末尾。
  4. 第四次调用strtok(NULL, s),因为已经到字符串末尾,返回NULL,循环结束。

注意事项

  • strtok会直接修改原字符串(把分隔符替换成\0),所以传入的字符串不能是const类型的。
  • 由于strtok用静态变量保存状态,它是线程不安全的,也不能嵌套调用处理多个字符串。如果需要线程安全或者多字符串处理,可以用strtok_r(POSIX标准)或strtok_s(C11标准)。

内容的提问来源于stack exchange,提问作者Marzzzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:02:45