关于strlen的实现

Jim_King_2000 2006-07-02 11:03:24
http://digi.it.sohu.com/20060217/n241879844.shtml

我在上述链接中看到关于strlen函数的实现,实现如下:
int strlen(const char *str)
{
assert(str != NULL);
int len = 0;
while((*str++) != '\0')
len++;
return len;
}
文章作者对上述代码的评论为:“读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为……”

本人不敢苟同,提出另外一种实现,大家觉得呢:
int strlen(const char *str)
{
assert(str);
const char *p = str;
while(*p++);
return p - str - 1;
}
...全文
1395 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysc918 2006-07-03
  • 打赏
  • 举报
回复
学习
tailzhou 2006-07-02
  • 打赏
  • 举报
回复
看错,lz的程序跟作者的程序都用了指针的加法

作者的int的加法确实是多余的
Jim_King_2000 2006-07-02
  • 打赏
  • 举报
回复
看看汇编就知道了
tailzhou 2006-07-02
  • 打赏
  • 举报
回复
指针移动也要对指针做加运算的吧?区别只是作者的程序是对int做自加。
对指针的加法比int的加法快?

不太明白
0黄瓜0 2006-07-02
  • 打赏
  • 举报
回复
从易读性上说,
while(*p++);
写为
while((*p++)!='\0');
为好,这也是林锐提倡的风格。



在这个短小函数中还显示不出二者可读性上明显的区别。
想象一下,在代码超过一页的函数中间,出现一句 while(*p++); 你一时又记不起p是什么类型的指针,是必要翻查p 的定义,然后再根据上下文推敲代码的意图,可读性打了折扣。
同样是在代码超过一页的函数中间,出现一句while((*p++)!='\0');一看p就是char*型的指针,一看就明白代码的意图。
而从代码风格的一直性上考虑,在这个短小函数中也应写成while((*p++)!='\0');
Jim_King_2000 2006-07-02
  • 打赏
  • 举报
回复
to mingming_lu(初来乍到):
我已阅读过林锐的《高质量C/C++编程》。本人对编程风格也比较感兴趣,欢迎一起讨论。
Jim_King_2000 2006-07-02
  • 打赏
  • 举报
回复
to mingming_lu(初来乍到):
可否详细指出我的代码的编码风格的问题?谢谢。
Jim_King_2000 2006-07-02
  • 打赏
  • 举报
回复
当然用x86汇编也可以,速度最快,但是可移植性差……
int _strlen(const char *str)
{
assert(str);
/*const char register *p = str;
while(*p++);
return p - str - 1;*/
__asm
{
mov edx, str
LN2_strlen:
mov cl, byte ptr [edx]
inc edx

test cl, cl
je SHORT LN1_strlen
jmp SHORT LN2_strlen
LN1_strlen:
mov eax, edx
sub eax, str
dec eax
}
} // just for fun
0黄瓜0 2006-07-02
  • 打赏
  • 举报
回复
从速度上说,楼主的应该快一点,因为移动一个指针比计算一次加法要快,
逍遥过客 2006-07-02
  • 打赏
  • 举报
回复
楼主的实现和别人的其实大同小异,这种简单的算法根本没有什么高深的地方,比的就不是思维的巧妙.楼主的源代码确实行数较少,但编码风格较差,不能说是好的程序.这种程序在管理比较规范的软件公司,是要罚款的,呵呵.建议看看林锐的<高质量C/C++编程>吧,那里面关于编程风格方面比较忌讳的地方,你这个程序里着实不少.
tailzhou 2006-07-02
  • 打赏
  • 举报
回复
应该作者的好,
作者用的int 你用的char 指针
int应该是机器计算最快的了.
lonelyforest 2006-07-02
  • 打赏
  • 举报
回复
能用都一样, 别在这些小东西上耗费我们太多的精力

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧