+ -
当前位置:首页 → 问答吧 → strtok 函数 的疑问

strtok 函数 的疑问

时间:2011-12-24

来源:互联网

c++ 中:

<cstring>
原型:

char *strtok(char *s, const char *delim);


 注意返回值。。。

一般用法如下:

char s[]=strtok(source,',');

source是源串,

source被分割后,重新组合,生成了,木有,的串。。。。

问题1:如果soeurce是 堆中的内存。。。。。

那么char s[] 岂不是有问题。。。。。 s是数组, 数组在栈中 ,栈中的数组保存的内容为堆中的字符串。。。。


问题2:

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

什么叫静态分配?  

我猜测这是与动态相对。。。 意思就是说: 使用的空间在 静态全局区中。。。。。

一般字符串 除了全局字符串之外,都在栈或 堆中。。。。。  

为什么要 使用静态的空间呢?

还有 即使在静态空间中, 为什么不安全呢???


问题很多,,希望 不嫌麻烦,帮忙解答一下。。。

谢谢了啊

作者: caddor2011   发布时间: 2011-12-24

char s[]=strtok(source,',');
这个用法是有问题的,不能这样调用,strtok返回的是char *指针,可能不同的编译器实现会不同,但它要么的确是返回的静态区的值(c函数是不能返回临时指针变量的),要么返回的是原指针的内容
你可以看下
char *source="aaaa";
char s[]=source; //语法有错
正确的用法:
char *s=strtok(source,',');

作者: keiy   发布时间: 2011-12-24

strtok是分割字符串,查找中间最长的单元
http://blog.csdn.net/hongwenjun/article/details/6710209



char *strtok(char *str1, const char *str2);
功能:函数返回字符串str1中紧接“标记”的部分的指针, 字符串str2是作为标记的分隔符。
如果分隔标记没有找到,函数返回NULL。为了将字符串转换成标记,
第一次调用str1 指向作为标记的分隔符。之后所以的调用str1 都应为NULL。

作者: hongwenjun   发布时间: 2011-12-24

谁能解释一下,

线程安全问题

作者: caddor2011   发布时间: 2011-12-24

第一个参数非NULL的时候会使用一个static变量存储下次扫描的起始位置.

作者: qq120848369   发布时间: 2011-12-24