博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题之实现系统函数系列一:实现memmove函数
阅读量:4671 次
发布时间:2019-06-09

本文共 1860 字,大约阅读时间需要 6 分钟。

编译环境

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

【算法编译环境】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 
#include
#include
void * my_memmove( void * const dest, const char * const src, size_t n ){ // check parameters if( 0 == 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 = 0; 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 = 0; i< n; i++ ) { *pdest = *psrc; pdest--; psrc--; } } return dest;}int main( int argc, char ** argv ){ char *src = new char[100]; sprintf( src, "%s", "hello world!" ); char * dest = new char[100]; memset( dest, 0, 100*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 0;}

【结论】

作者

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

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

转载于:https://www.cnblogs.com/gina/p/3248521.html

你可能感兴趣的文章
全局ajax事件
查看>>
javascript二维数组
查看>>
JavaScript 字符串属性和方法
查看>>
opencv新手注意
查看>>
Source InSight context 窗口丢失的解决办法
查看>>
cut point and bridge总结
查看>>
(5)Oracle基础--约束
查看>>
【Nginx】磁盘文件写入飞地发
查看>>
默认情况下安装的应用程序C盘后提示权限不足,当你开始介意。。。
查看>>
su root 后还是不能使用useradd ,useradd 等命令
查看>>
URL.createObjectURL图片预览
查看>>
js 中exec、test、match、search、replace、split用法
查看>>
Android开发笔记(一)手势识别
查看>>
mybatis 复习笔记03
查看>>
zoj 3703(背包)
查看>>
一种新的子波域滤波算法
查看>>
cookie之三天免登录代码
查看>>
1043 幸运号码 数位DP
查看>>
js18
查看>>
2018-2019-2 20175308实验一 《Java开发环境的熟悉》实验报告
查看>>