C语言标准库函数的理解与重写

1.实现strcpy 2.实现strcat 3.实现strstr 4.实现strchr 5.实现strcmp 6.实现memcpy 7.实现memmove

为了更好的去理解这几个函数的用法,自己去实现一下功能,才能更好的学习

#include
size_t Strlen(const char* str){	//无符号整型
    assert(str != NULL);//首先要进行合法性判断,如果字符串本身都有问题,那么就没必要检验了
    size_t count = 0;
    while(str[count] != '\0'){
        ++count;
    }
    return conunt;
}
#include
char* Strcpy(char* dest,const char* src){
    assert(dest != NULL);
    assert(src != NULL);
    int64_t i = 0;
    for(i = 0;src[i] != '\0';i++){
        dest[i] = src[i];
    }
    dest[i] = '\0';
    return dest;
}
#include
char* Strcat(char* dest,const char* src){
    assert(dest != NULL);
    assert(src != NULL);
    int i = 0;
    for(i = 0; dest[i] != '\0';i++);
    Strcpy(&dest[i],src);
    return dest;
}
#include
const char* Strstr(const char* str1,const char* str2){
    assert(str1 != NULL);
    assert(str2 != NULL);
    if(*str1 == '\0' || *str2 == '\0'){
        return NULL;
    }
    const char* black_ptr = str1;
    while(*black_ptr != '\0'){
        const char* sub_ptr = str2;
        const char* red_ptr = black_ptr;
        while(*red_ptr != '\0' && *sub_ptr != '\0' &&(*red_ptr == *sub_ptr)){
            ++red_ptr;
            ++sub_ptr;
        }
        if(*sub_ptr == '\0'){
            return black_ptr;
        }
        ++black_ptr;
    }
    return NULL;
}
#include
const char* Strchr(const char* str,int chr){
    assert(str != NULL);
    while(*str){//*str表示字符数组中第一个字符
        if(*str == (char)chr){
            return (char*)str;//此时返回的是第一个找到所需字符的地址
        }
        ++str;
    }
    return NULL;
}
#include
int Strcmp(const char* str1, const char* str2){
    assert(str1 != NULL);
    assert(str2 != NULL);
    while(*str1 != '\0' && *str2 != '\0'){
        if(*str1 > *str2){
            return 1;
        }else if(*str1 < *str2){
            return -1;
        }else{
            ++str1;
            ++str2;
        }
    }
    //此时如果str1或者str2有一个提前遇到了'\0',那么跳出了while循环,接着判断
    if(*str1 > *str2){
        return 1;
    }else if(*str1 < *str2){
        return -1;
    }else{
        return 0;
    }
}
#include
void* Memcpy(void* dest,void* src,size_t num){
    assert(dest != NULL);
    assert(src != NULL);
    char* pdest = (char*)dest;//void*不能解引用,类型改变,只在运算中起作用,是临时的,本身的类型不改变,所以最后还是返回dest
    char* psrc = (char*)src;
    size_t i = 0;
    for(i = 0;i < num;++i){
        pdest[i] = psrc[i];
    }
    return dest;
}
#include
void* Memmove(void* dest,const void* src,size_t num){
    assert(dest != NULL);
    assert(src != NULL);
    char* pdest = (char*)dest;
    char* psrc = (char*)src;
    if(pdest >= psrc && pdest < psrc + num){//这是标准库认为的缓冲区重合
        //起始dest指针如果在src缓冲区范围以内,拷贝为缓冲区重合
        //以外则不为缓冲区拷贝
        int64_t i = 0;//从最后一个元素的下标开始,倒着拷贝
        for(i = num - i;i >= 0;i++){
            pdest[i] = psrc[i];
        }
    }else{
        //完全按照原来方法拷贝
        Memcpy(dest,src,num);
    }
    return dest;
}

你可能感兴趣的:(C进阶)