strlen、strcmp、strcat、strcpy、memcpy基础函数的实现

最近实习+投简历+琐事弄得自己忙的不行不行的,终于今天可以开始记录一些东西了。。。

1.strlen函数的实现

1 int strlen(const char *str){

2     assert(str!=NULL);

3     int len=0;

4     while(*(str++) != '\0'){

5         len++;

6     } 

7     return len;         

8 }

2.strcmp函数的实现

int strcmp(const char *s, const char *p){

    assert(s != NULL && p != NULL);

    int ret = 0;

    while(!(ret = *(unsigned char *)s - *(unsigned char *)p) && *s){

        s++;

        p++;

    }

    if(ret > 0)return 1;

    if(ret < 0)return -1;

    return ret;

}

3.strcat函数的实现

char *strcat(char *dest, const char * src){

    assert(dest != NULL && src != NULL);

    char *addr = dest;

    while(*addr != '\0'){

        addr++;

    }

    while((*addr++ = *src++) != '\0');

    return dest;

}

4.strcpy函数的实现

strcpy函数实现可以运用memcpy函数,原因就是memcpy函数实现的时候考虑到了内存重叠的情况,而strcpy函数的一般实现没有考虑到内存重叠的情况。

实现一:

char *strcpy(char *dest, const char *src){

    assert(dest != NULL && src != NULL);

    char *addr = dest;

    while((*dest++ = *src++) != '\0');

    return *addr;

}

实现二:

char *strcpy(char *dest, const char *src){

    assert(dest != NULL && src != NULL);

    char *addr = dest;

    memcpy(dest, src, strlen(src)+1);

    return *addr;

}

5.memcpy函数的实现

memcpy函数实现的时候需要考虑内存重叠的情况。

void *memcpy(void *dest, const void *src, unsigned int count){

    assert(dest != NULL && src != NULL);

    void *addr = dest;

    if(dest <= src || (char *)dest >= (char *)src+count){//这种情况不会发生问题,直接复制就好(画图看看吧!)

        while(count--){

            *(char *)dest = *(char *)src;

            dest = (char *)dest+1;

            src = (cahr *)src+1;

        }

    }else{//这种情况是src后端的一部分与dest前段的一部分重合,一旦从头开始复制就会将src后端与dest重合的部分覆盖掉,导致信息丢失而出错。

        dest = (char *)dest+count-1;

        src = (char *)src+count-1;

        while(count--){

            *(char *)dest = *(char *)src;

            dest = (char *)dest-1;

            src = (char *)src-1;

        }

    }

    return addr;

}

 

你可能感兴趣的:(RCP)