免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: jxg945
打印 上一主题 下一主题

[函数] 不使用已有的系统调用或函数库,实现c库的函数:strstr() [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-08-05 19:56 |显示全部楼层

不使用已有的系统调用或函数库,实现c库的函数:strstr()

安全第一

论坛徽章:
0
12 [报告]
发表于 2005-08-05 21:34 |显示全部楼层

不使用已有的系统调用或函数库,实现c库的函数:strstr()

  1. #include <stdio.h>;
  2. char * mystrstr(char *ds,char *src){
  3.        char *test=src;
  4.        char *dst=ds;
  5.        int count=0;
  6.        if(dst==NULL||test==NULL)
  7.                return NULL;
  8.        while(*dst!='\0'&&*test!='\0'){
  9.                if(*dst!=*test){
  10.                        dst++;
  11.                        test=src;
  12.                        count=0;
  13.                }
  14.                else{
  15.                        dst++;
  16.                        test++;
  17.                        count++;
  18.                }
  19.        }
  20.        if(*test=='\0')
  21.                return (dst-count);
  22.        else
  23.                return NULL;
  24. }
  25. main()
  26. {
  27.         char *p="what's your name";
  28.         //char *c="go home";
  29.         printf("%s\n",mystrstr(p,"your"));
  30. }
复制代码

没仔细优化,能工作我就没管了

论坛徽章:
0
13 [报告]
发表于 2005-08-05 21:39 |显示全部楼层

不使用已有的系统调用或函数库,实现c库的函数:strstr()

我的测试通过了啊

论坛徽章:
0
14 [报告]
发表于 2005-08-05 21:45 |显示全部楼层

不使用已有的系统调用或函数库,实现c库的函数:strstr()

count你也没重新清0呢

论坛徽章:
0
15 [报告]
发表于 2005-08-08 12:44 |显示全部楼层

不使用已有的系统调用或函数库,实现c库的函数:strstr()

这么多人喜欢重复发明轮子啊

论坛徽章:
0
16 [报告]
发表于 2005-08-09 21:51 |显示全部楼层

不使用已有的系统调用或函数库,实现c库的函数:strstr()

原帖由 "jxg945" 发表:
   

$ ./a.out backackabc abc执行
或者./a.out backackabc abcd执行
您看看

可以的,我仔细测试过了
代码就是改改你的,所以我没做什么大改动
估计是我代码没贴好,上面有个字母t不知道怎么就乱了或者不看见了
  1. #include<stdio.h>;
  2. #include<unistd.h>;
  3. char *my_strstr(char *dst, char *src)
  4. {
  5.     char *a = dst;
  6.     char *b = src;
  7.     do {
  8.         if (*dst == *src) {
  9.             a = dst;
  10.             while ((*dst++) == (*src++)) {
  11.                 if (*src == '\0') {
  12.                     return a;
  13.                 }
  14.             }
  15.         }
  16.         src = b;
  17.     } while (*++dst != '\0');
  18.     return NULL;
  19. }
  20. int main(int argc, char **argv)
  21. {
  22.     char *p;
  23.     char q[100] = "abcddachytdacaab";
  24.     char *c = "Hello, what's your name";
  25.     p = my_strstr(q, "abc");
  26.     printf("[%s]\n%s\n", q, p);
  27.     p = my_strstr(c, "your");
  28.     printf("[%s]\n%s\n", c, p);
  29.     if (argc == 3) {
  30.         p = my_strstr(argv[1], argv[2]);
  31.         printf("[%s]\n", p);
  32.     }
  33. }
复制代码

论坛徽章:
0
17 [报告]
发表于 2007-09-01 00:38 |显示全部楼层
想想,确实可以做到更有效率点
比较第一个字符相同后,直接比较搜索字符串的最后一个字符(指针都+strlen(dest))
如果最后一个字符相同还是逐个比较
如果不同再从刚才加的长度+1处开始比较
O(m+n)是这样的么?这个如果理想情况下,效率比m+n还好呢,(m/n)+n

如果像62楼所说的
那么linux内核“也不是处处考虑周到(起码在效率方面,这个应该不要考虑可读性吧)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP