CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

strtok()问题

楼主shuimuyu(水木鱼)2005-04-12 09:06:02 在 Linux/Unix社区 / 程序开发区 提问

调用   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;  
                } 问题点数:20、回复次数:13Top

1 楼hoyt(hoyt(欢迎访问 www.linuxc.net))回复于 2005-04-12 09:22:28 得分 4

strtok会修改原字符串,你的远程不能修改,  
  临时申明一个变量,然后将s拷贝到这个变量中,将这个变量代替s传给strtok  
   
  欢迎访问我的个人网站   www.linuxc.netTop

2 楼gaoxianfeng(高)回复于 2005-04-12 09:43:57 得分 4

你被网上的例子误导  
   
  strtok(s,d);  
  这个函数是要查找s字串里面是否有d字符  
  如果有就会把s字串里的d字符用'\0'替换   这时候就有写入了  
  而你的char   *s="Golden:Global:View";   是静态区的变量   不可写的  
  如果你用strcpy(s,   "test");   也会内存异常  
   
  所以你应该改成  
  char   s[]="Golden:Global:View";Top

3 楼noble01(北风之神)回复于 2005-04-12 09:54:22 得分 1

原型:extern   char   *strtok(char   *s,   char   *delim);  
                   
      用法:#include   <string.h>  
       
      功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。  
       
      说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。  
                  strtok在s中查找包含在delim中的字符并用NULL('\0')来替换,直到找遍整个字符串。  
                  返回指向下一个标记串。当没有标记串时则返回空字符NULL。  
  strtok会修改字符串内容  
  Top

4 楼bywind1980(bywind1980)回复于 2005-04-12 14:01:03 得分 1

借地方问一下,char*   s="abcd";和char   s[]="abcd";这两条语句的区别是否就在于第一个s只是一个指向常量字符串的指针,而第二个s则是申请了一段内存来存储变量,而该变量的内容被初始化为"abcd"Top

5 楼gaoxianfeng(高)回复于 2005-04-12 15:33:05 得分 1

是的    
  而第二个s则是申请了一段内存来存储变量,而该变量的内容被初始化为"abcd"  
   
  其实是       abcd\0   五个字符Top

6 楼shuimuyu(水木鱼)回复于 2005-04-12 17:53:10 得分 0

还引出来一个问题是(具体程序如下)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;  
                }  
  Top

7 楼gaoxianfeng(高)回复于 2005-04-13 10:39:33 得分 0

反对在别人贴中发贴  
   
  你就如下用   标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);  
  Top

8 楼lito_rat(一只无聊的老鼠)回复于 2005-04-13 12:35:15 得分 0

学习Top

9 楼enidzhangyun(白云)回复于 2005-04-13 15:44:47 得分 0

gaoxianfeng(高)   :使用之前加上memset(New_p,   0,   sizeof(New_p));  
  Top

10 楼gaoxianfeng(高)回复于 2005-04-13 17:14:31 得分 8

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造成内存异常  
   
   
     
  Top

11 楼shuimuyu(水木鱼)回复于 2005-04-22 11:20:21 得分 0

嗯,大家说的都有道理,但是在没有发生内存异常的情况下strncpy(New_jj,buf,strlen(buf));New_jj变量输出有问题,是不是少了结束符的原因?Top

12 楼gaoxianfeng(高)回复于 2005-04-22 16:22:10 得分 0

strncpy  
  看源码你就明白   他只管往New_jj   拷贝strlen(buf)这么长的字符   而strlen   取长度只是取到'\0'前  
  也就是说   这个长度不包括   '\0'字符   那么   strncpy也就不拷贝'\0'   如果你的New_jj没有初始化  
  就会有些问题了Top

13 楼sharkhuang(走吧走吧!人总会慢慢长大~)回复于 2005-04-22 18:47:54 得分 1

strtok_r是线程安全Top

相关问题

  • 关于strtok函数
  • strtok函数的用法问题
  • 有其他方法实现strtok吗?
  • 在线给分,请详细分析strtok()函数的用法??
  • 谁能给一个自己写的strtok函数?
  • strtok()循环后的剩余部分能够得到吗?
  • strtok用起来的结果怎么跟帮助上的不一样?
  • 繁体系统下:某些汉字比如"珠"字的内码和符号:'['以及']' 有冲突,strtok函数返回值错误,请指教!
  • 使用strtok分割字符串,一不小心就容易出现执行到一半内容就被改变的问题,大家一般是用什么办法解决的?

关键词

  • 字符
  • 函数
  • 内存
  • 修改
  • 内容
  • view
  • strtok
  • buf
  • 字符串
  • 变量

得分解答快速导航

  • 帖主:shuimuyu
  • hoyt
  • gaoxianfeng
  • noble01
  • bywind1980
  • gaoxianfeng
  • gaoxianfeng
  • sharkhuang

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo