如何正确使用c语言strtok函数
的有关信息介绍如下:编写代码时,对字符串进行分析是最常见的任务。c语言中提供了一些字符串操作函数,如字符串拷贝、字符串连接、字符串长度计算、字符串查找等操作。
虽然c语言没有提供字符串分解split函数,但我们可以使用提供的strtok函数分割字符串。
本文介绍如何正确的使用c语言strtok函数。
strtok函数用来分解字符串,但是不像其他高级语言中split分解字符串返回数组,strtok只是分解字符串下一段内容。
我们看一下通常的strtok用法,如下所示:
strtok调用步骤:
1. 第一次调用strtok函数时,传递原始字符串以及分解字符串。
2. 之后再调用strtok函数时,只需要传递NULL和分解字符串。
函数返回值为分解得到字符串指针,当最后为NULL时,循环退出。
特别注意的是:strtok对原始字符串的一个副作用是,它会修改原始字符串,在匹配到分解字符串时,设置为字符串结束符0。
在实际编程时,笔者发现有时候因为使用strtok函数,有些想当然的用法。比如,对strtok函数的返回值的判断。
很多人可能以为strtok如果未找到分解字符串时会返回NULL,这其实就大错特错了。
通过对strtok函数的调用,我们发现并没有很方便,尤其是相比c语言中已经提供了字符串匹配函数strstr/strchr的情况下。
我们完全可以自己在循环中使用strstr/strchr等函数实现字符串分解,所以,这就是strtok函数使用场景太少,从而不常用造成生疏的原因。
比如,我们用strchr实现上述分割运算如下:
还一个注意点是:strtok函数不是线程安全函数。
在循环中调用strtok函数时,我们给strtok函数传递了NULL指针,那么函数怎么知道从原始字符串中哪个位置继续执行分解操作呢?
不难猜测,strtok函数内部使用了静态变量,保存了下一次分解起始位置。对于多线程调用strtok函数时,使用静态全局变量会被多个线程重复改变,造成错乱等问题。
一个可能的strtok函数的实现:
幸好,在windows环境中提供了strtok_s,而linux函数中提供了strtok_r安全函数。
这两个函数相比strtok多了一个保存中间指针变量的参数,这样就不用使用静态变量,从而保证多线程调用的安全性。
所以,如果使用strtok,更推荐使用strtok_r版本。