当前位置: 首页 > news >正文

C/C++自实现的函数(memset, memcpy, atoi)

函数原型:

void * memset ( void * buffer, int c, size_t num );

  关于void * 因为任何类型的指针都可以传入memset函数,这也真是体现了内存操作函数的意义,因为他操作的对象仅仅是一片内存,而不论这片内存是什么类型!

  void无类型,其实是一种类型上的抽象,它可以转换成任何类型!

void *myMemset(void *s, int ch, size_t n)  // point 1: s的类型未知,n代表字节数 
{
    assert(NULL != s);
    void *tmp = s;
    while(n --){
        *(char *)tmp = (char)ch; //point 2: 将tmp转成char类型占用1个字节来赋值成c
        tmp = (char *)tmp + 1;  // point 3: 每次自增加1个byte
    }
   return s; }

函数原型:

void * memcpy(void *dest, const void *src, size_t len);
void *myMemcpy(void *dest, const void *src, size_t n)   // ponit1: src声明为const类型 & 指定n个需要cp的字节
{
    assert(NULL != dest && NULL != src);
    int i = 0;
    void *tmp = dest;
    while(i < n){
        *((char *)tmp + i) = *((char *)src + i);
        ++ i;
    }
    return dest;
}

函数原型:

int atoi(const char *nptr);

  实现过程主要注意:int范围是否合理(用long long 和 int的最大值与最小值(最小值的表示-0)比较),符号的处理,非法字符,正负号。

const int INF_MAX = 0x7fffffff;
const int INF_MIN = 0x80000000;
enum  {Invalid = 0, Valid};
int errno;
void atoiCore(const char *str, bool minus, long long &num)
{
    while( '\0' != *str ){
        cout<<"str : "<<*str<<endl;
        if(*str >= '0' && *str <= '9'){
            num = num * 10 + (*str) - '0';
            str ++;
            if( (minus &&  -num < INF_MIN) || (!minus && num > INF_MAX)){ //超过int范围
                errno = Invalid;
                num = 0;
                return ;
            }
        }else{ // 非数字字符
            errno = Invalid;
            num = 0;
            return ;
        }
    }
    if ( minus )
        num = -num;
    errno = Valid;
}

//负数最小值(-2^31)的补码使用的是 -0的补码 负数最小值的补码使用的是 -0的补码 负数最小值的补码使用的是 -0的补码
int myAtoi(const char* str)
{
    assert( NULL != str);
    long long num = 0;  // point 1: 过程可能会溢出 使用long long
    errno = Invalid;
    if (*str != '\0')// point 2
    {
        bool minus = false;
        if (*str == '+'){
            ++ str;
        }else if(*str == '-'){
            ++ str;
            minus = true;
        }
        if('\0' != *str){
            atoiCore(str, minus, num);
        }
    }
    return (int) num; //保证范围后 返回 int
}

 

转载于:https://www.cnblogs.com/luntai/p/6472590.html

相关文章:

  • yii2之创建管理员
  • 使用Hive Rest API 连接HDInsight
  • oracle 批量改temp/data/redo file的路径
  • MAPZONE GIS SDK接入Openlayers3之三——瓦片数据集接入
  • php学习1
  • 机器学习之线性回归---logistic回归---softmax回归
  • php导出pdf
  • 10第十一天JDBC事务控制管理
  • 预处理指令
  • 我个人对c#基础的理解和总结
  • Java学习笔记【十二、网络编程】
  • php MongoDB driver 查询实例
  • 2017-03-05 CentOS中配置守护服务(Supervisor)监听dotnet core web程序的运行
  • BUG处理:自定义View绘制折线图invalidate();方法不回调onDraw();与Only the original thread that created a vi...
  • 【Swift学习笔记-《PRODUCT》读书记录-CoreData数据存储】
  • 【mysql】环境安装、服务启动、密码设置
  • Android开源项目规范总结
  • classpath对获取配置文件的影响
  •  D - 粉碎叛乱F - 其他起义
  • download使用浅析
  • gitlab-ci配置详解(一)
  • Just for fun——迅速写完快速排序
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • mysql innodb 索引使用指南
  • RxJS: 简单入门
  • windows下mongoDB的环境配置
  • 机器学习中为什么要做归一化normalization
  • 基于Android乐音识别(2)
  • 数组的操作
  • 在Unity中实现一个简单的消息管理器
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (145)光线追踪距离场柔和阴影
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (利用IDEA+Maven)定制属于自己的jar包
  • (十八)SpringBoot之发送QQ邮件
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • .net mvc部分视图
  • @KafkaListener注解详解(一)| 常用参数详解
  • []串口通信 零星笔记
  • [04] Android逐帧动画(一)
  • [20180129]bash显示path环境变量.txt
  • [C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [C进阶] 数据在内存中的存储——浮点型篇
  • [element-ui] el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败
  • [leetcode]Clone Graph
  • [Linux]使用CentOS镜像与rpm来安装虚拟机软件
  • [MICROSAR Adaptive] --- autosar官方文档阅读建议
  • [No000016]为什么假期计划总是做不到?
  • [NOI 2016]循环之美
  • [NOIP2000] 乘积最大