基础c字符串相关函数的源码实现

来源:互联网 发布:淘宝手机助手2017 编辑:程序博客网 时间:2024/06/04 23:26

本文说明的是c函数字符串的库源码的实现方式。

其中函数声明方式:
__cdecl 是C 声明的缩写(Declaration),是C语言默认的函数调用方法:所有参数从右到左依次入栈,参数由调用者清除,即手动清栈被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误

_stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。这些堆栈中的参数由被调用的函数在返回清除,自动清除,使用的指令是 retnX,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多或少,否则会编译出错。

字符串比较

int __cdecl strcmp (        const char * src,        const char * dst        ){        int ret = 0 ;        while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)                ++src, ++dst;        if ( ret < 0 )                ret = -1 ;        else if ( ret > 0 )                ret = 1 ;        return( ret );}


字符串拷贝

char * __cdecl strcpy(char * dst, const char * src){        char * cp = dst;        while( *cp++ = *src++ ) ;               /* Copy src over dst */        return( dst );}


字符串拼接 

char * __cdecl strcat (        char * dst,        const char * src        ){        char * cp = dst;        while( *cp )                cp++;                   /* find end of dst */        while( *cp++ = *src++ ) ;       /* Copy src to end of dst */        return( dst );                  /* return dst */}

字符串拷贝

char * __cdecl strncpy (        char * dest,        const char * source,        size_t count        ){        char *start = dest;        while (count && (*dest++ = *source++))    /* copy string */                count--;        if (count)                              /* pad out with zeroes */                while (--count)                        *dest++ = '\0';        return(start);}

查找指定字符串

char * __cdecl strstr (        const char * str1,        const char * str2        ){        char *cp = (char *) str1;        char *s1, *s2;        if ( !*str2 )            return((char *)str1);        while (*cp)        {                s1 = cp;                s2 = (char *) str2;                while ( *s1 && *s2 && !(*s1-*s2) )                        s1++, s2++;                if (!*s2)                        return(cp);                cp++;        }        return(NULL);}

查找字符串中最后出现的指定字符

char * __cdecl strrchr (        const char * string,        int ch        ){        char *start = (char *)string;        while (*string++)                       /* find end of string */                ;                                                /* search towards front */        while (--string != start && *string != (char)ch)                ;        if (*string == (char)ch)                /* char found ? */                return( (char *)string );        return(NULL);}



原创粉丝点击