关于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",分隔符是'-':
- 第一次调用
strtok(str, s)后,第一个'-'被替换成\0,返回的token是"This is ",内部保存的位置是第一个'-'后面的空格。 - 第二次调用
strtok(NULL, s)时,从这个空格开始扫描,跳过空格(因为空格不是分隔符),找到"www.tutorialspoint.com "作为第二个token,把第二个'-'替换成\0,保存位置到第二个'-'后面的空格。 - 第三次调用
strtok(NULL, s),扫描到" website"作为第三个token,保存位置到字符串末尾。 - 第四次调用
strtok(NULL, s),因为已经到字符串末尾,返回NULL,循环结束。
注意事项
strtok会直接修改原字符串(把分隔符替换成\0),所以传入的字符串不能是const类型的。- 由于
strtok用静态变量保存状态,它是线程不安全的,也不能嵌套调用处理多个字符串。如果需要线程安全或者多字符串处理,可以用strtok_r(POSIX标准)或strtok_s(C11标准)。
内容的提问来源于stack exchange,提问作者Marzzzz
相关产品推荐
相关产品推荐

