strtok和strtok_r

最新项目开发上需要用到字符串分割识别功能,了解到strtok用法,简单总结下。

strtok
函数原型char* strtok(char *str,const char *delimiters);

来分析一下这个分割字符串函数,这个函数是在传入的字符数组里进行调整,它并没有生成新的字符数组。
第一个参数可以是字符数组或者NULL,第一次切割传要切割的字符,第二次要在原来字符数组上继续切割就传NULL;

第二个参数传入的是切割符,这个参数看起来简单其实是比第一个还复杂,它传入的是一个字符串,而不是一个字符。

使用strtok注意事项
1)对同一个字符数组切割,第一个形参使用时候记得非第一次次分割,传的是NULL。
2)还有就是它会对源字符串修改,如果源字符串还要继续使用的话,先利用strcpy一个临时字符数组,在实现字符分割。
3)压入第一个形参是传字符数组,不能传const char *类型,这样是字符串常量不能进行修改。
4)我们传入的第二个形参是字符串,不是字符,意味着是“ ” ,是双引号,不是单引号‘ ’哪怕只有一个字符
5)在使用线程中,使用strtok是不安全的,因为他们共享全局变量,strtok的内部静态指针会被所有线程共享,所以才引出了我们strtok_r这个函数,我们下面会去讲解下。

函数strtok_r是函数strtok的可重入版本,也即线程安全版本。在函数strtok中剩余字符串是存储在一个静态变量中,因此,多线程在使用该静态变量时引起冲突;而strtok_r则使用用户传入的指针为每个用户saveptr重新申请变量,因而可以保证线程安全。

#include 
#include 
#include 

int main()
{
	char pSrc[] = "this is lincheng i am from hangzhou china";
	char* pToken = NULL;
	char* pSave = NULL;
	char* pDelimiter = " ";
	pToken = strtok_r(pSrc, pDelimiter, &pSave);
	printf("Begin:\n");
	while(pToken){
	printf("pToken[%s]; pSave[%s]\n",pToken,pSave);
	pToken = strtok_r(NULL, pDelimiter, &pSave);
	}
	printf("End!\n");
	return 0;
}

运行结果:

Begin:
pToken[this]; pSave[is lincheng i am from hangzhou china]
pToken[is]; pSave[lincheng i am from hangzhou china]
pToken[lincheng]; pSave[i am from hangzhou china]
pToken[i]; pSave[am from hangzhou china]
pToken[am]; pSave[from hangzhou china]
pToken[from]; pSave[hangzhou china]
pToken[hangzhou]; pSave[china]
pToken[china]; pSave[]
End!

你可能感兴趣的:(c语言)