Chinaunix

标题: [求助]关于strtok溢出的原因 [打印本页]

作者: blueant0    时间: 2007-01-18 17:07
标题: [求助]关于strtok溢出的原因
我在写程序的时候发现用strtok分割函数的时候,发现待分割字符串如果用str1="abcd"的方式生明,调用strtok就会溢出,如果是str1[]="abcd"就正常。
两者区别仅在于最后的\0
不知道strtok为什么在处理最后的\0时会溢出,不知道strtok如何实现的,请高手分析下,谢谢。
作者: boxpei    时间: 2007-01-18 17:10
问题一定不是strtok,而是你的用法,贴代码。
作者: blueant0    时间: 2007-01-18 17:16
#include <string.h>

int main()
{
  char str1[]="ab:de";
  char *delim=": ";
  char *res;

  printf("%s\n",strtok(str1,delim));
  return 0;
}
正常代码。

#include <string.h>

int main()
{
  char *str1="ab:de";
  char *delim=": ";
  char *res;

  printf("%s\n",strtok(str1,delim));
  return 0;
}
溢出代码。
作者: Edengundam    时间: 2007-01-18 17:28
原帖由 blueant0 于 2007-1-18 17:16 发表
#include <string.h>

int main()
{
  char str1[]="ab:de";
  char *delim=": ";
  char *res;

  printf("%s\n",strtok(str1,delim));
  return 0;
}
正常代码 ...


貌似是strtok会偷偷修改原字符串. 写到了只读区吧...
作者: mingyanguo    时间: 2007-01-18 17:34
没看出怎么叫溢出?
不过strtok会修改参数字符串,所以有时候需要strdup一下。
作者: converse    时间: 2007-01-18 17:42
str1="abcd"
str1[]="abcd"

指针,又是指针.
作者: boxpei    时间: 2007-01-18 17:49
char *str1="ab:de";
这样定义之后,str1指向的内容不允许修改,而strtok函数需要修改第一个参数的内容,所以报错。
作者: lrlinux    时间: 2007-01-18 17:51
企图修改常量字符串的内容而导致的错误
str1="abcd"
str1指向常量字符传。
作者: blueant0    时间: 2007-01-18 18:07
明白了,感谢楼上诸位。
作者: yuangong    时间: 2007-01-19 17:27
haha,又见这个问题!
作者: JohnBull    时间: 2007-01-21 20:12
注意原型!

  1. char *strtok(char *s, const char *delim);
复制代码


char *s前面没有const!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2