免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4301 | 回复: 18
打印 上一主题 下一主题

一个strtok的奇怪问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-18 10:42 |只看该作者 |倒序浏览
有下面代码,功能是分割每个email地址
  1. #include <stdio.h>;
  2. #include <string.h>;

  3. int main()
  4. {
  5.         char *s = "dd@163.net;xx@citiz.net;mudga@hotmail.com";
  6.         char *delim = ";";
  7.         char *content[5];
  8.         int content_num = 0;
  9.         int i;

  10.         content[0] = strtok(s,delim);
  11.         for(i = 1;i < 5; i++)
  12.         {
  13.                 content[i] = strtok(NULL,delim);
  14.                 content_num++;
  15.                 if (!content[i] )
  16.                         break;
  17.         }
  18.         for (i=0; i<content_num; i++)
  19.         {
  20.                 printf("content[%d]:%s",i,content[i]);
  21.         }
  22.         return 0;
  23. }
复制代码

编译后出现segment fault错误,环境是rh+gcc
但是奇怪的是,我如果在gdb下面调试这个程序时,不设断点,还是出现上面的错误,说是strtok出错;如果在strtok处设置断点的话,程序完全正常!这是什么原因呢?

论坛徽章:
0
2 [报告]
发表于 2004-10-18 11:12 |只看该作者

一个strtok的奇怪问题

给你一个正确的例子,取第一个邮件地址


  1. #include <stdio.h>;
  2. #include <string.h>;

  3. int main()
  4. {
  5.    char s[] = "dd@163.net;xx@citiz.net;mudga@hotmail.com";
  6.    char *delim = ";";

  7.    strtok(s,delim);
  8.    printf("%s\n", s);
  9.    return 0;
  10. }
复制代码


运行结果为dd@163.net
希望对你有启发

论坛徽章:
0
3 [报告]
发表于 2004-10-18 11:29 |只看该作者

一个strtok的奇怪问题

char *content[5];

你定义了这个二维数组,但是没有分配内存啊。当然会出core了
content=(char *)malloc( size*5);
size 自己定吧

论坛徽章:
0
4 [报告]
发表于 2004-10-18 11:55 |只看该作者

一个strtok的奇怪问题

不是指针数组的分配问题,
是char *s="dd@......."这里的问题,
strtok是会修改目标字符串的,用char *s="....."的形式分配来保存字符串的空间是只读的,改成char s[] = "...."就可以了

论坛徽章:
0
5 [报告]
发表于 2004-10-18 12:43 |只看该作者

一个strtok的奇怪问题

楼上正解.
strtok()这东西,能不用就不用.

论坛徽章:
0
6 [报告]
发表于 2004-10-18 13:02 |只看该作者

一个strtok的奇怪问题

[quote]原帖由 "virmin"]."就可以了[/quote 发表:

我试了一下,果然是这个问题。那我在调试设断点的时候就没有这个问题,是不是意味着gdb内部会为s重新分配了一个可以修改数据的内存?

论坛徽章:
0
7 [报告]
发表于 2004-10-18 13:06 |只看该作者

一个strtok的奇怪问题

原帖由 "gangcai" 发表:
愣ㄒ辶苏飧龆???椋??敲挥蟹峙淠诖姘 5比换岢鯿ore了
content=(char *)malloc( size*5);
size 自己定吧

char *content[5]不需要malloc吧,因为已经是数组了,定义后就已经有存储空间了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-10-18 13:32 |只看该作者

一个strtok的奇怪问题

[quote]原帖由 "virmin"]."就可以了[/quote 发表:


数组空间的分配也存在问题。
而且应该用strcpy将得到的token复制出去。

论坛徽章:
0
9 [报告]
发表于 2004-10-18 14:32 |只看该作者

一个strtok的奇怪问题

哪里还有问题?char *content[5]应该没有问题吧?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2004-10-18 14:39 |只看该作者

一个strtok的奇怪问题

virmin 说的没错。
你现在的程序看起来没有问题,可是非常危险。
因为你的char *content[5]中的5个元素全使指针,而这指针都使指的s中的不同位置。如果s改变或者销毁的话,那么这个5个就全使危险的元素。

如果你仅仅使为了如上的程序,打印出来,那么现在还没有问题。如果你想在以后,进一步应用char *content[5]。那么应当如virmin所说的,为他们开辟空间,并将内容复制一份。这样,char *content[5]才使安全的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP