免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5540 | 回复: 8

[C] 收集收集strlen的实现方法 [复制链接]

论坛徽章:
0
发表于 2011-01-06 21:39 |显示全部楼层
按照惯例,先声明:如果有厌恶“茴字有19种写法”之类问题的兄弟,请回避~~


小弟是初学者,知道三种方法,但还不知道对不对。请高手指点。

  1. int strlen1(char s[])
  2. {
  3.      int n;
  4.      n = 0;
  5.      while (s[n++] != '\0')
  6.           ;
  7.      return n;
  8. }
复制代码

  1. int strlen2(char *s)
  2. {
  3.      int n;

  4.      for (n = 0; *s != '\0'; s++)
  5.      {
  6.           n ++;
  7.      }
  8.      return n;
  9. }
复制代码

  1. int strlen3(char *s)
  2. {
  3.      char *p = s;
  4.      while (*p != '\0')
  5.      {
  6.           p ++;
  7.      }
  8.      return p - s;
  9. }
复制代码

论坛徽章:
0
发表于 2011-01-06 22:26 |显示全部楼层
微软的写法
  1. size_t __cdecl strlen (
  2.         const char * str
  3.         )
  4. {
  5.         const char *eos = str;

  6.         while( *eos++ ) ;

  7.         return( eos - str - 1 );
  8. }
复制代码

论坛徽章:
0
发表于 2011-01-06 23:19 |显示全部楼层
回复 2# proghua


    谢谢你支持新手~

    实际上我现在还在从基础学起,甚至都还没考虑字符串长度超过int能表示的最大值的问题。

   感谢!!!

论坛徽章:
0
发表于 2011-01-06 23:45 |显示全部楼层

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2011-01-07 08:27 |显示全部楼层
这几个写法都是一个道理

论坛徽章:
0
发表于 2011-01-07 11:06 |显示全部楼层
lz你的写法编出来代码,只不过是C语句不同而已,编出来的指令都差不了多少。
相比之下2楼微软的代码还更胜一筹。

论坛徽章:
0
发表于 2011-01-07 12:11 |显示全部楼层
回复 6# 以泪洗面


    多谢指教~

    小弟就是不懂,才来此收集高手们的写法,借鉴借鉴。。。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2011-01-08 20:09 |显示全部楼层
本帖最后由 yulihua49 于 2011-01-08 20:28 编辑
按照惯例,先声明:如果有厌恶“茴字有19种写法”之类问题的兄弟,请回避~~


小弟是初学者,知道三种 ...
quxiaoyong 发表于 2011-01-06 21:39



    效率最高的是汇编。
movb al,0
mov ecx,-1
mov  edi,str
rep scansb
mov eax,edi
sub eax,str
编译器一般都不会使用这种最高效的指令
这个scansb指令,以一个时钟周期一个字符的速度搜索内存,别的语言没法比。
如今的编译器都是基于risc的,完全没有发挥cisc的优势。
经测试,movs,scans,xalt,jcxz等串指令的效率比常规指令序列高很多,可惜至今编译器不肯使用。
同样,指令手册规定了ecx是计数器,esi是源地址指针,edi是目的地址指针,一些专用的指令会优化处理之。可惜所有的编译器都不按规则使用。

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
发表于 2011-01-08 21:05 |显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP