strtok()问题

shuimuyu 2005-04-12 09:06:02
调用 strtok()函数执行的时候为什么老是提示Segmentation fault错误。简单的程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>

main()
{
char *s="Golden:Global:View";
char *d=":";
char *p;

p=strtok(s,d);
printf("%s\n",s);


return 0;
}
...全文
249 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuimuyu 2005-04-22
  • 打赏
  • 举报
回复
嗯,大家说的都有道理,但是在没有发生内存异常的情况下strncpy(New_jj,buf,strlen(buf));New_jj变量输出有问题,是不是少了结束符的原因?
sharkhuang 2005-04-22
  • 打赏
  • 举报
回复
strtok_r是线程安全
gaoxianfeng 2005-04-22
  • 打赏
  • 举报
回复
strncpy
看源码你就明白 他只管往New_jj 拷贝strlen(buf)这么长的字符 而strlen 取长度只是取到'\0'前
也就是说 这个长度不包括 '\0'字符 那么 strncpy也就不拷贝'\0' 如果你的New_jj没有初始化
就会有些问题了
lito_rat 2005-04-13
  • 打赏
  • 举报
回复
学习
gaoxianfeng 2005-04-13
  • 打赏
  • 举报
回复
反对在别人贴中发贴

你就如下用 标c函数?
buf=strtok('\0',d); //???
printf("buf=%s\n",buf);
printf("len=%d\n",strlen(buf));
strncpy(New_p,buf,strlen(buf)); //???
printf("New_p=%s\n",New_p);

buf=strtok('\0',d); //???
printf("buf=%s\n",buf);
printf("len=%d\n",strlen(buf));
strncpy(New_kk,buf,strlen(buf)); //???
printf("New_kk=%s\n",New_kk);
gaoxianfeng 2005-04-13
  • 打赏
  • 举报
回复
enidzhangyun(白云) ( ) 信誉:100 2005-04-13 15:44:00 得分: 0
gaoxianfeng(高) :使用之前加上memset(New_p, 0, sizeof(New_p));

strncpy(New_p,buf,strlen(buf)); //???

:)
你知道buf 这个str多大吗?
如果大于New_p的容量会如何?
strncpy(New_p,buf,Min(sizeof(New_p)-1,strlen(buf)));
New_p[sizeof(New_p)-1] = '\0';
strncpy主要就是怕人用strcpy造成内存异常



enidzhangyun 2005-04-13
  • 打赏
  • 举报
回复
gaoxianfeng(高) :使用之前加上memset(New_p, 0, sizeof(New_p));
noble01 2005-04-12
  • 打赏
  • 举报
回复
原型:extern char *strtok(char *s, char *delim);

用法:#include <string.h>

功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。

说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。
strtok在s中查找包含在delim中的字符并用NULL('\0')来替换,直到找遍整个字符串。
返回指向下一个标记串。当没有标记串时则返回空字符NULL。
strtok会修改字符串内容
gaoxianfeng 2005-04-12
  • 打赏
  • 举报
回复
你被网上的例子误导

strtok(s,d);
这个函数是要查找s字串里面是否有d字符
如果有就会把s字串里的d字符用'\0'替换 这时候就有写入了
而你的char *s="Golden:Global:View"; 是静态区的变量 不可写的
如果你用strcpy(s, "test"); 也会内存异常

所以你应该改成
char s[]="Golden:Global:View";
hoyt 2005-04-12
  • 打赏
  • 举报
回复
strtok会修改原字符串,你的远程不能修改,
临时申明一个变量,然后将s拷贝到这个变量中,将这个变量代替s传给strtok

欢迎访问我的个人网站 www.linuxc.net
shuimuyu 2005-04-12
  • 打赏
  • 举报
回复
还引出来一个问题是(具体程序如下)strncpy(New_kk,buf,strlen(buf));用这个函数给New_kk赋值,长度用strlen(buf)确定,但是输出New_kk后面总是多一些乱码,而用一个具体的数字代替strlen(buf)时就能正确显示出来,这是为什么?

char p[50]="songfx:1Globaldiunldug0:yoweur";
char *buf;
char New_asd[30];
char New_kk[20];
char New_jj[30];
char *d=":";
printf("p=%s\n",p);

buf=strtok(p,d);
printf("buf=%s\n",buf);
printf("len=%d\n",strlen(buf));
strncpy(New_jj,buf,strlen(buf));

buf=strtok('\0',d);
printf("buf=%s\n",buf);
printf("len=%d\n",strlen(buf));
strncpy(New_p,buf,strlen(buf));
printf("New_p=%s\n",New_p);

buf=strtok('\0',d);
printf("buf=%s\n",buf);
printf("len=%d\n",strlen(buf));
strncpy(New_kk,buf,strlen(buf));
printf("New_kk=%s\n",New_kk);
return 0;
}
gaoxianfeng 2005-04-12
  • 打赏
  • 举报
回复
是的
而第二个s则是申请了一段内存来存储变量,而该变量的内容被初始化为"abcd"

其实是 abcd\0 五个字符
bywind1980 2005-04-12
  • 打赏
  • 举报
回复
借地方问一下,char* s="abcd";和char s[]="abcd";这两条语句的区别是否就在于第一个s只是一个指向常量字符串的指针,而第二个s则是申请了一段内存来存储变量,而该变量的内容被初始化为"abcd"

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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