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;
    }
  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/beixiaobei/p/10914225.html
Copyright © 2011-2022 走看看