strtok 函数 的疑问

caddor2011 2011-12-24 08:25:25
c++ 中:

<cstring>
原型:

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


注意返回值。。。

一般用法如下:

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

source是源串,

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

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

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


问题2:

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

什么叫静态分配?

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

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

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

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


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

谢谢了啊

...全文
120 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
caddor2011 2011-12-25
  • 打赏
  • 举报
回复
结贴 ,谢谢各位了


真是惭愧啊,,,

一个小小的函数,都达不到你们认识的深度。。。。

乐儿爷 2011-12-25
  • 打赏
  • 举报
回复
1.做做实验啊
2.strtok就是非线程安全的。也就是全局只存储一份结果。
thread 1 strtok(...)
thread 2 同时 strtok(...)
结果就未知了。
hongwenjun 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。
柯本 2011-12-24
  • 打赏
  • 举报
回复
char s[]=strtok(source,',');
这个用法是有问题的,不能这样调用,strtok返回的是char *指针,可能不同的编译器实现会不同,但它要么的确是返回的静态区的值(c函数是不能返回临时指针变量的),要么返回的是原指针的内容
你可以看下
char *source="aaaa";
char s[]=source; //语法有错
正确的用法:
char *s=strtok(source,',');

qq120848369 2011-12-24
  • 打赏
  • 举报
回复
第一个参数非NULL的时候会使用一个static变量存储下次扫描的起始位置.
caddor2011 2011-12-24
  • 打赏
  • 举报
回复
谁能解释一下,

线程安全问题

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧