zoukankan      html  css  js  c++  java
  • c/c++面试题(8)memcopy/memmove/atoi/itoa

    1.memcpy函数的原型:

       void* memcpy(void* dest,cosnt void* src,size_t n);

       返回值:返回dest;

       功能:从源内存地址src拷贝n个字节到dest内存地址.

       这里必须要求源地址的内存和目标地址的内存没有覆盖,如果有覆盖结果是未定义的.

    #include <stdio.h>
    #include <assert.h>
    void* my_memcpy(void* dest,const void* src,size_t n)
    {
        assert(dest != NULL && src != NULL && n > 0);
        char* dest_t = (char*)dest;
        const char* src_t  = (char*)src;
        while(n--)
            *dest_t++ = *src_t++;
        return dest;
    }
    int main(void)
    {
        char str[] = "abcedf";
        char  buf[20] = "aaaaaaaa";
        my_memcpy(str,buf,sizeof(str));
        printf("%s
    ",(char*)str);
        return 0;
    }


    2.memmove的原型:

       void* memmove(void* dest,const void* src,size_t n);

       和memcpy的功能差不多,只是多了一层考虑内存有覆盖的情况.

       如果dest比src小,就从低地址开始拷贝.

        如果dest比src大,就从高地址开始拷贝.

        如果dest和src一样,就不拷贝.

    #include <stdio.h>
    void* my_memmove(void* dest,const void* src,size_t n)
    {
        char* d = (char*)dest;
        const char* s = (char*)src;
        if( d < s) //start copying  at begining while dest is little
        {
            while(n--)
                *d++ = *s++;
        }
        else if(d > s) //start copying at end while dest is bigger
        {
            d += n - 1;
            s += n - 1;
            while(n--)
                *d-- = *s--;
        }
        return dest;
    }

    3.atoi的原型:

      int my_atoi(char* pstr)

      功能:将字符串转换成整型数;atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号

               才开始做转换,而遇到非数字或字符''结束转换,并将结果返回.(返回转换后的整型数);

    #include <stdio.h>
    #include <assert.h>
    int my_atoi(char* pstr)
    {
        assert(pstr != NULL);
        int res = 0;
        int sign = 1;
        while(*pstr == ' '|| *pstr == '	')
            pstr++;
        sign = (*pstr == '-'? -1 : 1); /*求得符号位置*/
        if(*pstr == '-' || *pstr == '+') /*跳过符号位置*/
            pstr++;
        while(*pstr != '' && *pstr >= '0' && *pstr <= '9')
        {
            res = *pstr - '0' + res*10;
            pstr++;
        }
        return sign*res; /*返回带符号的值*/
    }
    int main(void)
    {
        char a[] = "-110000";
        char b[] = "  456";
        int c = 0;
        c = my_atoi(a);
        printf("%d
    ",c);
        c = my_atoi(b);
        printf("%d
    ",c);
        return 0;
    }

    4.itoa的原型:

     

        

  • 相关阅读:
    Ping链路测试
    开源EDR(OSSEC)基础篇- 01 -设计定位与能力输出
    全网最详细的最新稳定OSSEC搭建部署(ossec-server(CentOS7.X)和ossec-agent(CentOS7.X))(图文详解)
    centos7 编译问题:aclocal-1.14: command not found
    Centos 6.x 安装 docker
    CentOS7--删除virbr0
    为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname
    编译rxtx
    Linux 入侵检测中的进程创建监控
    ActionBarSherlock的使用——(一)配置
  • 原文地址:https://www.cnblogs.com/yasanlun/p/3842523.html
Copyright © 2011-2022 走看看