面试题之实现系统函数系列一:实现memmove函数

时间:2023-03-09 08:02:13
面试题之实现系统函数系列一:实现memmove函数

编译环境

本系列文章所提供的算法均在以下环境下编译通过。

【算法编译环境】Federa 8,linux 2.6.35.6-45.fc14.i686
【处理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
【内存】 2025272 kB

前言

在面试笔试当中,让面试者自己实现某些库函数也是数见不鲜。下面要讲的一个算法来自百度的面试题。memove函数是C语言里面的一个标准库,包含在头文件里。要是先这样一个算法,需要考虑目标字符串和源字符串边界重叠的情况。

本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。

正文

【题目】

用C语言实现函数void *memmove(void *dest, const void *src, size_t n)。memmove函数的功能死拷贝src所指向内存内容前n个字节到dest所指的地址上。

【例子】

源字符串是hello word!,要求目标字符串也是helloword!。

【分析】

作为公用库函数,请注意安全检查,注意处理内存区重合的情况。代码本身比较简单。

【代码】

#include <iostream>
#include <cstdio>
#include <cstring> void * my_memmove( void * const dest, const char * const src, size_t n )
{
// check parameters
if( == n )
{
return NULL;
}
if( NULL == dest || NULL == src )
{
return NULL;
} char * psrc = (char *)src;
char * pdest = (char *)dest;
if( pdest <= psrc || pdest > psrc + n )
{
std::cout << "forward overlapping" << std::endl;
// copy forward direction
for( size_t i = ; i < n; i++ )
{
*pdest = *psrc;
pdest++;
psrc++;
}
}
else
{
std::cout << "backward overlapping" << std::endl;
// copy backward direction
pdest = pdest + n;
psrc = psrc + n;
for( size_t i = ; i< n; i++ )
{
*pdest = *psrc;
pdest--;
psrc--;
}
}
return dest;
} int main( int argc, char ** argv )
{
char *src = new char[];
sprintf( src, "%s", "hello world!" );
char * dest = new char[];
memset( dest, , *sizeof(char ) );
std::cout << src << std::endl;
char * result = (char*)my_memmove( dest, src, strlen(src) );
std::cout << result << std::endl;
delete src;
delete dest;
return ;
}

【结论】

面试题之实现系统函数系列一:实现memmove函数

作者

出处:http://www.cnblogs.com/gina

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。