面试遇到的字符串操作

1.实现memcpy函数
memcpy函数:c语言内存拷贝函数,使用参数为void*,以及需要拷贝内存的长度,以字节为单位。
本身memcpy没有考虑过内存的重叠问题,所以只需要保证需要复制的内容,复制到相应的目的地址就行了。

void* memcpy(void* des,const void* src,size_t len){
     char* d = (char*)des;
     char* s = (char*)src;
     while(len--)
          *d++ = *s++;
     return dest;
} 

这里注意第二个参数是const void*
以及在运算过程当中的,char* 类型的转换。

2.memmove 函数的实现

void* memmove(void* dest,const void* src,size_t len){
     char* d= des;
     char* s = src;
     if(d < s){
        /*it will be OK even if there is a overlap that do not 
        * start from the start:dest 
        */
          while(len--)
               *d++= *s++;
     }else{// dest  is bettwen src and src + len - 1 ,
           //there is a overlap between [dest ,dest+len) with [src,src+len)
          /**we should copy from the 
          **end of the src that is src + len - 1;
          **/
          char* lasts = s + (len - 1);
          char* lastd = d +(len - 1);
          while(len--)
               *lastd -- = *lasts--;
     }
     return dest;
}

当两个区间的尾部重叠的时候,我们从头部开始复制。
当两个区间的头部重叠的时候,我们从尾部开始复制。

3.strcpy的实现

char* strcpy(char* dest,const char* src){
     char* d = dest;
     char* s = src;
     while( (*d++ = *s++) !='\0' );//把\0 也给复制了
     return dest;
}

复制的时候需要注意最后的’\0’也需要复制到目标地址当中。

4.strncpy的实现

char* strncpy(char* dest,const char* src,size_t n){
     size_t i;
     for(i=0;i<n && s[i] !='\0';++i)
          dest[i] = src[i];
     for(;i < n;++i)
          dest[i] = '\0';
}

strncpy是拷贝特定数量的字符到目的地址。
如果目标地址空间比较大,需要把源地址的所有字符复制到目标地址当中,并且置目标地址后部分内容为 ”\0”
如果目标地址空间太小,那么出现不可知的问题。第二个for 不会执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值