C语言基础(string标准库函数及其实现)

1,memchr

    -->C 库函数 void *memchr(const void *str, int c, size_t n) 在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。

        void *memchr(const char *str,int c,size_t n){

            const unsigned char *p = str;

            while(n--!=0){

                if((unsigned char)c == *p++)

                    return (void *)(p-1);

            }

            return NULL;

        }

2,memcmp

    -->C 库函数 int memcmp(const void *str1, const void *str2, size_t n)) 把存储区 str1 和存储区 str2 的前 n 个字节进行比较。

        int memcmp(const char * cs,const char * ct,size_t count)

        {

                const  char *su1, *su2;

                int res = 0;

                for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)

                        if ((res = *su1 - *su2) != 0)

                                break;

                return res;

        }

3,memcpy

    -->C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字符到存储区 str1。

        void * memcpy(void *dest, const void *src, size_t count)

        {

                unsigned long *dl = (unsigned long *)dest, *sl = (unsigned long *)src;

                char *d8, *s8;

 

                if (src == dest)

                        return dest;

 

                if ( (((ulong)dest | (ulong)src) & (sizeof(*dl) - 1)) == 0) {

                        while (count >= sizeof(*dl)) {

                                *dl++ = *sl++;

                                count -= sizeof(*dl);

                        }

                }

                d8 = (char *)dl;

                s8 = (char *)sl;

                while (count--)

                        *d8++ = *s8++;

                return dest;

        }

**4,memset

    -->C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符

        void * memset(void * s,int c,size_t count)

        {

                 unsigned long *sl = (unsigned long *) s;

                 unsigned long cl = 0;

                 char *s8;

                 int i;

 

                 /* do it one word at a time (32 bits or 64 bits) while possible     */

                 if ( ((ulong)s & (sizeof(*sl) - 1)) == 0) {

                         for (i = 0; i < sizeof(*sl); i++) {

                                 cl <<= 8;

                                 cl |= c & 0xff;

                         }

                         while (count >= sizeof(*sl)) {

                                 *sl++ = cl;

                                 count -= sizeof(*sl);

                         }

                 }

                 /* fill 8 bits at a time */

                 s8 = (char *)sl;

                 while (count--)

                         *s8++ = c;

                return s;

        }

        void * memset(void * s,int c,size_t count)

        {

            char *xs = (char *)s;

            while(count--){

                *xs++ = c;

            }

            return s;

        }

**5,strcat

    -->C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

        char * strcat(char * dest, const char * src)

        {

                char *tmp = dest;

                while (*dest)

                        dest++;

                while ((*dest++ = *src++) != '\0')

                        ;

                return tmp;

        }

6,strncat

    -->C 库函数 char *strncat(char *dest, const char *src, size_t n) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。

        char * strncat(char *dest, const char *src, size_t count)

        {

                char *tmp = dest;

                if (count) {

                        while (*dest)

                                dest++;

                        while ((*dest++ = *src++)) {

                                if (--count == 0) {

                                        *dest = '\0';

                                        break;

                                }

                        }

                }

                return tmp;

        }

**7,strcmp

    -->C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

        int strcmp(const char * cs,const char * ct)

        {

                register signed char __res;

                while (1) {

                        if ((__res = *cs - *ct++) != 0 || !*cs++)

                                break;

                }

                return __res;

        }

***********************************************************    

int strcmp(const char *str1,const char *str2)

        {

            while(*str1 == *str2)

            {

                if(*str1 == '\0')

                    return0;

                str1++;

                str2++;

            }

            return *str1 - *str2;

        }

*******************************************************

8,strncmp

    -->C 库函数 int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字节。

        int strncmp(const char * cs,const char * ct,size_t count)

        {

                register signed char __res = 0;

                while (count) {

                        if ((__res = *cs - *ct++) != 0 || !*cs++)

                                break;

                        count--;

                }

                return __res;

        }

**9,strlen

    -->求字符串长度

        size_t strlen(const char * s)

        {

                const char *sc;

                for (sc = s; *sc != '\0'; ++sc)

                        ;

                return sc - s;

        }

**10,strcpy

    -->C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。

        char * strcpy(char * dest,const char *src)

        {

                char *tmp = dest;

                while ((*dest++ = *src++) != '\0')

                        ;

                return tmp;

        }

**11,strstr

    -->C 库函数 char *strstr(const char *s1, const char *s2) 在字符串 s1 中查找第一次出现字符串 S2 的位置,不包含终止符 '\0'。

        char * strstr(const char * s1,const char * s2)

        {

               int l1, l2;

                l2 = strlen(s2);

                if (!l2)

                        return (char *) s1;

                l1 = strlen(s1);

                while (l1 >= l2) {

                        l1--;

                        if (!memcmp(s1,s2,l2))

                                return (char *) s1;

                        s1++;

                }

                return NULL;

        }

**12,strchr

    -->C 库函数 char *strchr(const char *str, int c) 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。

        char * strchr(const char * s, int c)

        {

                for(; *s != (char) c; ++s)

                        if (*s == '\0')

                                return NULL;

                return (char *) s;

        }

**13,strrchr

    -->C 库函数 char *strrchr(const char *s, int c) 在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。

        char * strrchr(const char * s, int c)

        {

               const char *p = s + strlen(s);

               do {

                   if (*p == (char)c)

                       return (char *)p;

               } while (--p >= s);

               return NULL;

        }

14,strspn

    -->C 库函数 size_t strspn(const char *s, const char *accept) 检索字符串 s 中第一个不在字符串 accept 中出现的字符下标。

        size_t strspn(const char *s, const char *accept)

        {

                const char *p;

                const char *a;

                size_t count = 0;

                for (p = s; *p != '\0'; ++p) {

                        for (a = accept; *a != '\0'; ++a) {

                                if (*p == *a)

                                           break;

                        }

                        if (*a == '\0')

                                return count;

                        ++count;

                }

                return count;

        }

15,strpbrk

    -->C 库函数 char *strpbrk(const char *cs, const char *ct) 检索字符串 cs 中第一个匹配字符串 ct中字符的字符,不包含空结束字符。也就是说,依次检验字符串 cs 中的字符,当被检验字符在字符串 ct 中也包含时,则停止检验,并返回该字符位置。

        char * strpbrk(const char * cs,const char * ct)

        {

                const char *sc1,*sc2;

                for( sc1 = cs; *sc1 != '\0'; ++sc1) {

                        for( sc2 = ct; *sc2 != '\0'; ++sc2) {

                                if (*sc1 == *sc2)

                                        return (char *) sc1;

                        }

                }

                return NULL;

        }

 

16,strswab

    -->交换字节

        char *strswab(const char *s)

        {

                char *p, *q;

                if ((NULL == s) || ('\0' == *s)) {

                        return (NULL);

                }

                for (p=(char *)s, q=p+1; (*p != '\0') && (*q != '\0'); p+=2, q+=2) {

                        char  tmp;

                        tmp = *p;

                        *p  = *q;

                        *q  = tmp;

                }

                return (char *) s;

        }

        

 

 


 

        


 

        

你可能感兴趣的:(C语言基础)