zoukankan      html  css  js  c++  java
  • 面试题之实现系统函数系列一:实现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( 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;
    }

    【结论】

    1

    作者

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

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

  • 相关阅读:
    FusionSphere产品功能
    openstack各组件详解和通信流程
    素数、杨辉三角、封装结构和集合操作(16)——集合及操作
    素数、杨辉三角、封装结构和集合操作(15)——IPython使用和封装解构
    素数、杨辉三角、封装结构和集合操作(14)——杨辉三角单行覆盖解法
    线性数据结构(13)——求质数
    线性数据结构(12)——菱形、三角形、闪电打印和斐波那契数列计算
    线性数据结构(11)——九九乘法表详解
    Python元组与字符串操作(10)——冒泡法
    lvm调整卷大小
  • 原文地址:https://www.cnblogs.com/gina/p/3248521.html
Copyright © 2011-2022 走看看