面试:C/C++常见库函数实现

1. void *mymemcpy(void *dest, const void* src, size_t n);

     内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

 1 void* memcpy(void* dest,void* src,size_t n){
 2     assert(dest != NULL && src != NULL);
 3 
 4     if(src < dest && (char*)src + n > dest){
 5         char* pdst = (char*)dest+n-1;
 6         char* psrc = (char*)src+n-1;
 7         while(n--){
 8             *pdst-- = *psrc--;
 9         }
10     }else{
11         char* pdest = (char*)dest;
12         char* psrc = (char*)src;
13         while(n--){
14             *pdest++ = *psrc++;
15         }
16     }
17     return dest;
18 }

2.void *memset(void *s, int c, size_t n);

1 void* memset(void* src,int c,size_t n){
2     assert(src != NULL);
3     char* psrc = (char*)src;
4     while(n--){
5         *psrc++ = (char)c;
6     }
7     return src;
8 }

3. char* strcpy(char* dest,const char* src);

 

 1 char* strcpy(char* dest,const char* src){
 2     assert(dest != NULL && src != NULL);
 3 
 4     size_t n = strlen(src);
 5     if(src < dest && src + n > dest){
 6         char* pdst = dest + n;
 7         *pdst-- = '\0';
 8         src = src + n - 1;
 9         while(n--){
10             *pdst-- = *src--;
11         }
12     }else{
13         char* pdst = dest;
14         while((*pdst++ = *src++) != 0);
15     }
16     return dest;
17 }

 

4. char* mystrncpy(char* dest,char* src,size_t n);

 1 char* strncpy(char* dest,const char* src,size_t n){
 2     assert(dest != NULL && src != NULL);
 3 
 4     if(src < dest && src + n > dest){
 5         int m = strlen(src) < n ? strlen(src):n;
 6         char* pdst = dest+m;
 7         *pdst-- = '\0';
 8         src = src + m-1;
 9         while(m--){
10             *pdst-- = *src--;
11         }
12     }else{
13         char* pdst = dest;
14         size_t i = 0;
15         while(i++ < n && (*pdst++ = *src++) != '\0');
16         if(*(pdst-1) != '\0') *pdst = '\0';
17     }
18     return dest;
19 }

5.char* strcat(char* dest,const char* src)

1 char* strcat(char* dest,const char* src){
2     assert(dest != NULL && src != NULL);
3     char* pdst = dest;
4     while(*pdst != '\0'){
5         pdst++;
6     }
7     while((*pdst++ = *src++) != '\0');
8     return dest;
9 }

6.int strcmp(const char* s1,const char* s2)

1 int strcmp(const char* s1,const char* s2){
2     assert(s1 != NULL && s2 != NULL);
3     while(s1 && s2 && *s1 == *s2){
4         s1++;
5         s2++;
6     }
7     return *s1 - *s2;
8 }

7.size_t strlen(const char* s)

size_t strlen(const char* src){
    assert(src != NULL);
    size_t ret = 0;
    while(*src++ != '\0'){
        ret++;
    }
    return ret;
}
posted @ 2017-07-19 11:38  wxquare  阅读(761)  评论(0编辑  收藏  举报