• 一些常用字符串操作函数的内部实现


    我整理了一下常用的字符串库函数的内部实现,截自linux内核中的lib/string.c文件,绝对标准的程序,供大家参考。

    memset:

        /*
         * memset - Fill a region of memory with the given value
         * @s: Pointer to the start of the area.
         * @c: The byte to fill the area with
         * @count: The size of the area.
         */
        void *memset(void *s, int c, size_t count)
        {
            char *xs = s;
    
            while (count--)
                *xs++ = c;
            return s;
        }

    memcpy:

        /*
        * memcpy - Copy one area of memory to another
        * @dest: Where to copy to
        * @src: Where to copy from
        * @count: The size of the area.
        */
        void *memcpy(void *dest, const void *src, size_t count)
        {
        char *tmp = dest;
        const char *s = src;
        while (count--)
        *tmp++ = *s++;
        return dest;
        }

    memmove:

        /*
         * memmove - Copy one area of memory to another
         * @dest: Where to copy to
         * @src: Where to copy from
         * @count: The size of the area.
         * Unlike memcpy(), memmove() copes with overlapping areas.
         */
        void *memmove(void *dest, const void *src, size_t count)
        {
            char *tmp;
            const char *s;
    
            if (dest <= src) {
                tmp = dest;
                s = src;
                while (count--)
                    *tmp++ = *s++;
            } else {
                tmp = dest;
                tmp += count;
                s = src;
                s += count;
                while (count--)
                    *--tmp = *--s;
            }
            return dest;
        }

    memcmp:

        /*
         * memcmp - Compare two areas of memory
         * @cs: One area of memory
         * @ct: Another area of memory
         * @count: The size of the area.
         */
        int memcmp(const void *cs, const void *ct, size_t count)
        {
            const unsigned char *su1, *su2;
            int res = 0;
    
            for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
                if ((res = *su1 - *su2) != 0)
                    break;
            return res;
        }

    strcpy:

        /*
         * strcpy - Copy a %NUL terminated string
         * @dest: Where to copy the string to
         * @src: Where to copy the string from
         */
        char *strcpy(char *dest, const char *src)
        {
            char *tmp = dest;
    
            while ((*dest++ = *src++) != '');
    
            return tmp;
        }

    strncpy:

        /*
         * strncpy - Copy a length-limited, %NUL-terminated string
         * @dest: Where to copy the string to
         * @src: Where to copy the string from
         * @count: The maximum number of bytes to copy
         *
         * The result is not %NUL-terminated if the source exceeds
         * @count bytes.
         *
         * In the case where the length of @src is less than that of
         * count, the remainder of @dest will be padded with %NUL.
         */
        char *strncpy(char *dest, const char *src, size_t count)
        {
            char *tmp = dest;
    
            while (count) {
                if ((*tmp = *src) != 0)
                    src++;
                tmp++;
                count--;
            }
    
            return dest;
        }

    strcat:

        /*
         * strcat - Append one %NUL-terminated string to another
         * @dest: The string to be appended to
         * @src: The string to append to it
         */
        char *strcat(char *dest, const char *src)
        {
            char *tmp = dest;
    
            while (*dest)
                dest++;
            while ((*dest++ = *src++) != '');
    
            return tmp;
        }

    strncat:

        /*
         * strncat - Append a length-limited, %NUL-terminated string to another
         * @dest: The string to be appended to
         * @src: The string to append to it
         * @count: The maximum numbers of bytes to copy
         *
         * Note that in contrast to strncpy(), strncat() ensures the result is
         * terminated.
         */
        char *strncat(char *dest, const char *src, size_t count)
        {
            char *tmp = dest;
    
            if (count) {
                while (*dest)
                    dest++;
                while ((*dest++ = *src++) != 0) {
                    if (--count == 0) {
                        *dest = '';
                        break;
                    }
                }
            }
    
            return tmp;
        }

    strcmp:

        /*
         * strcmp - Compare two strings
         * @cs: One string
         * @ct: Another string
         */
        int strcmp(const char *cs, const char *ct)
        {
            unsigned char c1, c2;
    
            while (1) {
                c1 = *cs++;
                c2 = *ct++;
                if (c1 != c2)
                    return c1 < c2 ? -1 : 1;
                if (!c1)
                    break;
            }
    
            return 0;
        }

    strncmp:

        /*
         * strncmp - Compare two length-limited strings
         * @cs: One string
         * @ct: Another string
         * @count: The maximum number of bytes to compare
         */
        int strncmp(const char *cs, const char *ct, size_t count)
        {
            unsigned char c1, c2;
    
            while (count) {
                c1 = *cs++;
                c2 = *ct++;
                if (c1 != c2)
                    return c1 < c2 ? -1 : 1;
                if (!c1)
                    break;
                count--;
            }
    
            return 0;
        }

    strchr:

        /*
         * strchr - Find the first occurrence of a character in a string
         * @s: The string to be searched
         * @c: The character to search for
         */
        char *strchr(const char *s, int c)
        {
            for (; *s != (char)c; ++s)
                if (*s == '')
                    return NULL;
    
            return (char *)s;
        }

    strlen:

        /*
         * strlen - Find the length of a string
         * @s: The string to be sized
         */
        size_t strlen(const char *s)
        {
            const char *sc;
    
            for (sc = s; *sc != ''; ++sc);
    
            return sc - s;
        }

    strnlen:

        /*
         * strnlen - Find the length of a length-limited string
         * @s: The string to be sized
         * @count: The maximum number of bytes to search
         */
        size_t strnlen(const char *s, size_t count)
        {
            const char *sc;
    
            for (sc = s; count-- && *sc != ''; ++sc);
    
            return sc - s;
        }

    strsep:

        /*
         * strsep - Split a string into tokens
         * @s: The string to be searched
         * @ct: The characters to search for
         *
         * strsep() updates @s to point after the token, ready for the next call.
         */
        char *strsep(char **s, const char *ct)
        {
            char *sbegin = *s;
            char *end;
    
            if (sbegin == NULL)
                return NULL;
    
            end = strpbrk(sbegin, ct);
            if (end)
                *end++ = '';
            *s = end;
    
            return sbegin;
        }

    strstr:

        /*
         * strstr - Find the first substring in a %NUL terminated string
         * @s1: The string to be searched
         * @s2: The string to search for
         */
        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;
        }

    from:http://blog.chinaunix.net/uid-22030783-id-2142080.html

  • 相关阅读:
    GeoServer源码之Dispatcher
    Geoserver开发之OWS是什么?
    GeoServer数据工作空间:怎么设置?
    Java注解:不使用注解的话,也能实现初始化bean吗?
    JSP编译错误无法显示:PWC6033: Unable to compile class for JSP
    Spring Bean初始化失败
    【每日一具17】CAD迷你画图/最新2020R9
    用python爬虫简单网站却有 “多重思路”--猫眼电影
    【每日一具17】CAD迷你画图/最新2020R9
    Python教你如何对 Excel(xlxs文件) 表的读写和处理
  • 原文地址:https://www.cnblogs.com/jiu0821/p/6261704.html
Copyright © 2020-2023  润新知