手写strcpy、strlen、strcmp、strcat、memcpy、memmove、memset

1、strcpy

char* strcpy(char* dest, const char* src) {
    assert(dest != NULL && src != NULL);
    char* begin = dest;
    while (*src != '\0') {
        *dest = *src;
        ++dest;
        ++src;
    }
    return begin;
}

如果不写assert,则没有判断异常情况,dest的末尾没有赋 '\0'
正确写法:

char* strcpy(char* dest, const char* src) {
    assert(dest != NULL && src != NULL);
    char* begin = dest;
    while ((*dest++ = *src++) != '\0') 
    ;
    return begin;
}

引自:https://baike.baidu.com/item/strcpy/5494519?fr=aladdin

2、strlen

size_t strlen(const char * str) {
    assert(str == NULL)
    size_t len = 0;
    while (*str++ != '\0') {
        ++len;
    }
    return len;
}

3、strcmp

int strcmp(const char *s1 const char *s2) {
    assert((s1 != NULL) && (s2 != NULL));
    
    while (*s1 == *s2) {
        if (*s1 == '\0')
            return 0;
        
        ++s1;
        ++s2;
    }
    
    return *s1 - *s2;
}

4、strcat

char* strcat(const char *dest, const char *src) {
    assert((dest != NULL) && (src != NULL));
    
    char *ret = dest;
    while (*dest != '\0') {
        ++dest;
    }
    
    while ((*dest++ = *src++) != '\0')
        ;
    return ret;
}

引自:https://baike.baidu.com/item/strcat

引自:https://songlee24.github.io/2015/03/15/string-operating-function/

5、memcpy

void* memcpy(void *dst, const void *src, size_t size) {
    char *s_dst = (char *)dst;
    char *s_src = (char *)src;
    if (s_dst == NULL || s_src == NULL)
        return NULL;
    
    if (s_src < s_dst && s_src + size > s_dst) { //考虑地址重叠,且dst的地址高于src的地址的情况
        s_dst = s_dst + size - 1;
        s_src = s_src + size - 1;
        while(size--) {
            *s_dst-- = *s_src--;
        }
    } else {  //考虑地址不重叠,或者地址重叠,且dst的地址低于src地址的情况
        while (size--) {
            *s_dst++ = *s_src++;
        }
    }
    return dst;
}

引自:https://zhuanlan.zhihu.com/p/70873246
https://blog.csdn.net/Li_Ning_/article/details/51418400

6 memset

void* memset(void *dst, int val, size_t size) {
    char *s_dst = dst;
    char ch = val;
    if (s_dst == NULL) {
        return NULL;
    }
    
    while (size--) {
        *s_dst++ = ch;
    }
    
    return dst;
}

https://blog.csdn.net/u013009575/article/details/17584267

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • C语言常用函数 sqrt 求给定值的平方根 sqrt() 用来求给定值的平方根,其原型为: 【参数】x 为要计算平...
    Asura_Luo阅读 2,696评论 0 1
  • 一、字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 s...
    JaiUnChat阅读 1,753评论 0 7
  • ###字符数组的定义:有一定顺序关系的若干个字符型变量的集合,就是字符数组。可以是一维的,也可以是多维的。字符数组...
    邻家的妹妹阅读 838评论 0 1
  • 6月11日上午,龙曲镇潮坡小学开展了以“歌颂家乡教育”为主题的诗歌朗诵比赛活动。诗歌内容丰富多彩,形式不拘一格。同...
    张高平阅读 571评论 0 0
  • 小说类 1.《红楼梦》 2.《人性的枷锁》 3.《月亮与六个便士》 4.《霍乱时期的爱情》 5.《飘》 6.《牛虻...
    三月潺湲阅读 254评论 1 1

友情链接更多精彩内容