zoukankan      html  css  js  c++  java
  • strlen、strcmp、strcat、strlen、memmove

    #include <cassert>
    #include <iostream>
    using namespace std;
    
    
    
    /*
    strlen 返回字符串不包含结束符的长度
    */
    int mystrlen(const char *str)
    {//非递归strlen
        assert(str);//必须不为空
        int len = 0;
        while (*str++)
            len++;
        return len;
    }
    int mystrlen1(const char *str)
    {//递归 stelen
        if (*str == '') return 0;
        return mystrlen1(str + 1) + 1;
    }
    /*
    strcmp,如果str1大,返回正数,小返回负数,相等返回0
    ascii码共128种(0-127),所以可以转为unsigned char(范围-128到127)
    且无符号两数相等情况下相减必为0,而有符号相减为0,两数的每一位不一定相等
    */
    int mystrcmp(const char* str1,const char* str2)
    {
        assert(str1 && str2);//允许一个为空
        int ret = 0;
        while (!(ret = *(unsigned char*)str1 - *(unsigned char*)str2) && *str1)//注意*str1放后面,前面肯定计算完毕
        {//结束符ascii码是0。相等进入while,不相等则ret存储差值,如果str1短,已经是负值,长则为正值
            str1++;
            str2++;
        }
        if (ret > 0) return 1;
        else if(ret < 0) return 0;
        else return 0;
    }
    
    /*
    strcat 返回新dst。将字符串src包括结束符都复制到dst后,注意覆盖dst的
    不考虑dst不够存放src的情况(会报错,但没法处理,因为dst为指针,不知其空间大小
    */
    char *mystrcat(char *dst,const char *src)
    {
        assert(dst && src);//允许一个为空
        char *tmp = dst;
        while (*tmp) tmp++;//指到dst的结束符处(比strcpy多了这一步
        while (*src)
            *tmp++ = *src++;
        *tmp = *src;//复制结束符
        return dst;
    }
    
    /*
    strcpy 返回新dst,将字符串src包括结束符全部复制到dst开始处
    不考虑dst不够存放src,容易溢出
    */
    char *mystrcpy(char *dst, const char *src)
    {
        assert(dst && src);
        char *tmp = dst;
        while (*src)
            *tmp++ = *src++;
        *tmp = *src;
        return dst;
    }
    /*
    memmove size指定复制长度,如果源在前且与目标有重叠,则逆向复制
    而memcpy都是正向复制
    */
    void *mymemmove(void *dst, void *src, size_t size)
    {
        if (dst == nullptr || src == nullptr) return nullptr;
        void *res = dst;
        char *pdst = (char *)dst;
        char *psrc = (char *)src;
        if (pdst >= psrc && pdst <= psrc + size)
        {
            for (int i = size - 1; i >= 0; i--)
                *(pdst + i) = *(psrc + i);//源在前,逆向复制
        }
        else
        {
            for (int i = 0; i < size; i++)
                *(pdst + i) = *(psrc + i);//源在后/不重叠,正向复制
        }
        return dst;
    }
    
    int main()
    {
        char str[] = {'1','2','3'};
        const char *a = "12";
    
        //cout << mystrlen(a) << endl;
        //cout << mystrcmp("2222", "22") << endl;
        char dst[5] = "12";
        cout << mystrcat(dst, "34") << endl;
        cout << mystrcpy(dst, "34") << endl;
    }
  • 相关阅读:
    JS对象—字符串总结(创建、属性、方法)
    vue过滤器(filter)
    mac快捷键大全
    mac版 sublime快捷键大全
    mysql数据库—表的查询排序操作大全
    emmet的html和css使用技巧大全
    Java多线程——ReentrantLock源码阅读
    你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识
    Java多线程——AQS框架源码阅读
    Java多线程——ReentrantReadWriteLock源码阅读
  • 原文地址:https://www.cnblogs.com/beixiaobei/p/10914225.html
Copyright © 2011-2022 走看看