char *strtok(char *s1, const char *s2)
重复调用此函数将字符串 s1 分解为“标记”——即
字符串被分成子字符串,
每个都以 '\0' 结尾,其中
'\0' 替换任何字符
包含在字符串 s2 中。第一次通话
使用要标记为 s1 的字符串;
后续调用使用 NULL 作为第一个
争论。指向开头的指针
返回当前令牌的数量;无效的
如果没有更多则返回
代币。
Hi,
我一直在尝试使用strtok
刚才发现如果我通过char*
into s1
,我遇到分段错误。如果我传入一个char[]
, strtok
工作正常。
为什么是这样?
我用谷歌搜索了一下,原因似乎是关于如何char*
是只读的并且char[]
是可写的。更彻底的解释将不胜感激。
你初始化了什么char *
to?
如果像
char *text = "foobar";
那么你就有了一个指向一些只读字符的指针
For
char text[7] = "foobar";
那么你就有了一个七元素的字符数组,你可以用它来做你喜欢的事情。
strtok
写入您给它的字符串 - 用覆盖分隔符null
并保留指向字符串其余部分的指针。
因此,如果你向它传递一个只读字符串,它会尝试写入它,并且你会得到一个段错误。
另外,因为strtok
保留对字符串其余部分的引用,它是不可重入的 - 您一次只能在一个字符串上使用它。最好避免,真的 - 考虑 strsep(3) - 例如,请参见此处:http://www.rt.com/man/strsep.3.html http://www.rt.com/man/strsep.3.html(尽管仍然写入字符串,因此具有相同的只读/段错误问题)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)