字符串函数的模拟实现(2)

  • memcpy

功能:从src所指的内存地址的起始位置开始,拷贝count个字节的数据到目标dest所指的内存地址的起始位置中。

#include <stdio.h>
#include<assert.h>

void* my_memcpy(void* dest,const void* src,size_t count){
    assert(dest);
    assert(src);
    void* ret = dest;
    while(count--){
        *(char*)dest = *(char*)src;
        dest = (char*)dest+1;
        src = (char*)src+1;
    }
    return ret;
}

int main(){
    char buf[] = "abcdefghigk";
    my_memcpy(buf+2,buf,5);
    printf("%s\n",buf+2);
    return 0;
}
  • memmove

功能:由src所指内存区域复制count个字节到dest所指内存区域。

#include <stdio.h>
#include<assert.h>
#include<string.h>

void* my_memmove(void* dest,const void* src,size_t count){
    assert(dest);
    assert(src);
    void* ret = dest;
    if(dest <= src || (char*)dest >= ((char*)src+count)){
        while(count--){
            *(char*)dest = *(char*)src;
            dest = (char*)dest+1;
            src = (char*)src+1;
        }
    }
    else{
        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 ret;
}

int main(){
    char s[] = "hello world";
    my_memmove(s,s+3,strlen(s)+1-3);
    printf("%s\n",s);
    return 0;
}
  • memset
功能:以dest为起始位置的count个字节的内存区域用整数c填充。
#include <stdio.h>
#include<assert.h>

void* my_memset(void* dest,int c,size_t count){
    assert(dest);
    if(count < 0)
        return NULL;
    char* tmp = (char*)dest;
    while(count--)
        *tmp++ = c;
    return dest;
}

int main(){
    char buf[10];
    int i = 0;
    printf("sizeof(buf) = %d\n",sizeof(buf));
    for(i = 0;i < 10;i++)
        printf("buf[%d] = %d\n",i,buf[i]);
    printf("-----------------------------------\n");
    my_memset(buf,1,sizeof(buf));
    for(i = 0;i < 10;i++)
        printf("buf[%d] = %d\n",i,buf[i]); 
    return 0;
}
  • memcmp

功能:比较内存区域内ptr1和ptr2的前num个字节。

#include <stdio.h>
#include<assert.h>

int my_memcmp(const void* ptr1,const void* ptr2,size_t num){
    assert(ptr1);
    assert(ptr2);
    while(num--){
        while(*(char*)ptr1 == *(char*)ptr2){
            if(*(char*)ptr1 == '\0')
                return 0;   
            ptr1++;
            ptr2++;
        }
    }
    if(*(char*)ptr1 > *(char*)ptr2)
        return 1;
    else if(*(char*)ptr1 < *(char*)ptr2)
        return -1;
}

int main(){
    char* p = "adcc";
    char* q = "axcc";
    printf("%d\n",my_memcmp(p,q,3));
    return 0;
}
  • memchr

功能:从buf所指的内存区域的前count个字节查找字符c

#include <stdio.h>
#include<assert.h>
#include<string.h>

void* memchr(const void* buf,int c,size_t count){
    assert(buf);
    while(count--){
        if(*(char*)buf == (char)c)
            return (void*)buf;
        buf = (char*)buf+1;
    }
    return NULL;
}

int main(){
    char* pch;
    char str[] = "hello world";
    pch = (char*)memchr(str,'w',strlen(str));
    if(pch != NULL)
        printf("fpund at position %d\n",pch-str+1);
    else
        printf("not found\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/cecilia3333/article/details/80100486
今日推荐