Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158321
  • 博文数量: 40
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 355
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-27 18:05
文章分类
文章存档

2011年(1)

2010年(9)

2009年(16)

2008年(14)

我的朋友

分类: LINUX

2010-02-08 22:12:24

glib2.0中strlen函数的定义如下:

#include <string.h>

size_t
strlen (
const char *str)
{
  
int cnt;

  asm(
"cld\n"            /* Search forward. 清方向位 */
      
/* Some old versions of gas need `repne' instead of `repnz'.  */
          
//ECX!=0且ZF=0则继续循环
      "repnz\n"            /* Look for a zero byte.  */
          
//AL-(ES:[EDI])
      "scasb" /* %0, %1, %3 */ :
      
//输出cnt,初值为-1(==ECX);EAX=0;EDI=str 
      "=c" (cnt) : "D" (str), "0" (-1), "a" (0));
      
  
return -2 - cnt;
}

 其中size_t的定义位于stddef.h:

typedef unsigned long size_t;

注意点:
(1)该函数返回无符号整数
if(strlen(x)>=strlen(y))...与
if(strlen(x)-strlen(y))...的含义并不相同,无符号数绝不可能为负数.

(2)一个自定义的实现:
#include
size_t strlen(const char *str)
{
    int len=0;
    while(*str++!='\0')
        len++;
    return len;
}

阅读(1604) | 评论(0) | 转发(0) |
0

上一篇:vmware下找不到hgfs

下一篇:字节对齐算法

给主人留下些什么吧!~~