strtok_r函数

strtok_r函数,第1张

free 和 malloc 是对应的。如果从标准库或者系统库中得到的指针,一定是由库来维护的。从strtok_r输出的缓冲是在内部分配的,在程序结束的时候,库会进行释放 *** 作的。如果你最后free了,就会造成double free的错误。

----------------------------------------

myStrBuf是从strtok_r输出的缓冲,系统对把分配到的一个缓冲的地址传给myStrBuf。但是具体是malloc还是其他带字节对齐的分配方法前行,这个由系统决定的。你只要记住一点,在你自己的程序里面有几个malloc就有几个free,不能多也不能少。其他的指针系统会管理的

------------------------------------------

程序最后是需要free的迹悔肢。姿世free(str)但不是myStrBuf

strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经亮段不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。

strtok是一个线程不安全的函数,因为它使用了敬迹誉静态分配的空间来存储被分割的字符串位置

线程安全的函数叫strtok_r,ca。

运用strtok来判断ip或者mac的时候务必要先用其他的方法判断'.'或':'的个数,因为用strtok截断的话,比如:"192..168.0...8..."这个字符串,strtok只会截取四次,中间的...无论多少都会被当作一个key。

函数strtok保州陆存string中标记后面的下一个字符的指针,并返回当前标记的指针。

后面再调用strtok时,第一个参数为NULL,继续将string标记化。NULL参数表示调用strtok继续从string中上次调用 strtok时保存的位置开始标记化。

如果调用strtok时已经没有标记,则strtok返回NULL。注意strtok修改输入字符串,因此,如果调用strtok之后还要在程序中使用这个字符串,则应复制这个字 符串。

strtok:

分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。

功能:

分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。

例如:strtok("abc,def,ghi",","),最后可以分割成为abc def ghi.尤其在点分十进制的IP中提取应用较多。

函数使用:

strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。

c

#include<string.h>

#include<stdio.h>

int main(void)

{

char input[16]="abc,d"

char*p

/*strtok places a NULL terminator

infront of the token,if found*/

p=strtok(input,",")

if(p)

printf("%s\n",p)

/*Asecond call to strtok using a NULL

as the first parameter returns a pointer

to the character following the token*/

p=strtok(NULL,",")

if(p)

printf("%s\n",p)

return0

}

c++

#include<iostream>

#include<cstring>

using namespace std

int main()

{

char sentence[]="This is a sentence with 7 tokens"

cout <<"The string to be tokenized is:\嫌御n" <<sentence <<"\n\nThe tokens are:\n\n"

char *tokenPtr=strtok(sentence,"")

while(tokenPtr!=NULL) {

cout<<tokenPtr<<'\n'

tokenPtr=strtok(NULL,"")

 芹和岩 }

//cout <<"After strtok,sentence=" <<tokenPtr<<endlreturn0

}

函数第一次调用需设置两个参数。第一次分割的结果,返回串中第一个 ',' 之前的字符串,也就是上面的程序第一次输出abc。

第二次调用该函数strtok(NULL,","),第一个参数设置为NULL。结果棚橡返回分割依据后面的字串,即第二次输出d。

strtok是一个线程不安全的函数,因为它使用了静态分配的空间来存储被分割的字符串位置

线程安全的函数叫strtok_r,ca

运用strtok来判断ip或者mac的时候务必要先用其他的方法判断'.'或':'的个数,因为用strtok截断的话,比如:"192..168.0...8..."这个字符串,strtok只会截取四次,中间的...无论多少都会被当作一个key

其他相关信息

下面的说明摘自于最新的Linux内核2.6.29,说明了这个函数已经不再使用,由速度更快的strsep()代替

/** linux/lib/string.c** Copyright (C) 1991, 1992 Linus Torvalds*//** stupid library routines.. The optimized versions should generally be found

* as inline code in <asm-xx/string.h> 

* These are buggy as well.. 

* * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de> 

* - Added strsep() which will replace strtok() soon (because strsep() is 

* reentrant and should be faster). Use only strsep() in new code, please. 

** * Sat Feb 09 2002, Jason Thomas <jason@topic.com.au>, 

* Matthew Hawkins <matt@mh.dropbear.id.au> 

* - Kissed strtok() goodbye

*/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12145862.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存