guanpengchn / guanpengchn.github.io

:memo: code on DEV branch, blogs on ISSUES
https://guanpengchn.github.io
18 stars 9 forks source link

strcpy/strlen/strcat/strcmp/memset/memcpy的实现 #36

Open guanpengchn opened 5 years ago

guanpengchn commented 5 years ago
#include <assert.h>
#include <stdio.h>

// 字符串拷贝strcpy
char* strcpy(char* des, const char* src){
    assert((NULL!=des)&&(NULL!=src));
    char * res = des;
    while((*des++=*src++)!='\0');
    return res;
}

// 字符串长度strlen
int strlen(const char* src){
    assert((NULL!=src));
    int res=0;
    while((*src++)!='\0'){
        ++res;
    }
    return res;
}

// 字符串链接strcat
char* strcat(char* des, const char* src){
    assert((NULL!=des) && (NULL!=src));
    char* res = des;
    while(*des!='\0')
        ++des;
    while(*des++=*src++);
    return res;
}

// 字符串比较strcmp
int strcmp(const char* s1, const char* s2){
    assert((NULL!=des) && (NULL!=src));
    while(*s1 == *s2){
        if(*s1 == '\0')
            return 0;
        ++s1;
        ++s2;
    }
    return *s1-*s2;
}

//将指针一个范围变为一个数
void* memset(void* src, int c, unsigned int n){
    assert(NULL!=src);
    void* res = src;
    while(n--){
        *(char*)src = c;
        (char*)src ++;
    }
    return res;
}

//将指针一个范围拷贝另一个指针的数
void* memcpy(void* dest,void* src, unsigned int n){
    assert(NULL != dest && NULL != src);
    void* res=dest;
    while(n--){
        *(char*)dest = *(char*)src;
        (char*)dest++;
        (char*)src++;
    }
    return res;
}

有关于while((*des++=*src++)!='\0');的理解,等同于

while(
des' = des,
src' = src,
*des' = *src',
*des' != '\0'
){
  des = des' + 1;
  src = src' + 1;
}