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;
}

 

posted on 2014-09-04 10:43  高山漏水  阅读(237)  评论(0编辑  收藏  举报