注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

NET START HERE

研究C/C++、网络/通信/协议编程、网络安全、软件安全

 
 
 

日志

 
 

strtok段错误解决办法  

2011-12-26 09:59:44|  分类: 技术探讨 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
原型:char *strtok(char *s, const char *delim);
 s 为要分解的字符串, delim 为分隔符字符串。首次调用时, s 必须指向要分解的字符串,随后调用要把 s 设成 NULL 。 strtok 在 s 中查找包含在 delim 中的字符 并用 NULL(‘/0’) 来替换,直到找遍整 个字符串。返回指向目前找到的最后一个标记串,当没有标记串时则返回空字符 NULL 。
 
看下面的一段程序:
#include<string.h>
int main()
{
       char *s="Golden Global View";
       char *d=" ";
       char *p;
       p=strtok(s,d);
       while(p)
       {
              printf("%s/n",p);
              p=strtok(NULL,d);
       }
       return 1;
}
编译没有问题,但运行时会出现 Segmentation fault 的错误。
 
有些人就会 百思不得其解,认为是 strtok 的问题,其 实不然。如果将 s 的定义由 char *s 改成 char s[] 或 char s[20] ,则运行时就不会出现段错误。可见问题不是 strtok 而是字符串常量的问题。看 strtok 的原型, s 不是 const 的,说明在 strtok 里会修改 s 的值,而如果定义 char *s="Golden Global View" ,则 s 指向只读区域不能修改。
可以看下面 的程序:
 
#include<string.h>
int main()
{
       char *s=(char *)malloc(sizeof(char)*10);
       s="abcdef";
       *(s+1)='g';
}
运行时会出现段错误。
 
下面的程序:
 
#include<string.h>
int main()
{
       char *s=(char *)malloc(sizeof(char)*10);
       strcpy(s,"abcdef");
       *(s+1)='g';
}
则会正确运行。
 
出现这些不同的结果,究其原因,是“非常量指针指向了常量字符串”。 abcdef 本身是一个常量字符串,系统把它放在了只读权限的内存空间,用可读写的指针指向这块区域本身就是错误的(逻辑上),而对只读内存区域进行写操作 则造成了实际的错误 [2] 。 char s[]=”abc” 则不然,首先声明了一个字符数组,然后将数组的大小定义成刚好能存下 abc 字 符串,并且将 abc 存入该数组,这时数组存放在数据区并且已经在数据区分配了相应的空间。其实如果想改写指针指向的空 间,就要确保指针指向可写的空间,想强制改写只读区域的内容是不鼓励的。


 
  评论这张
 
阅读(884)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017