您的位置:首页 > 职场人生

面试遇到的字符串操作

2016-09-23 08:49 232 查看
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 不会执行。

4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试 字符串