函数原型:

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 + ; // 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 = ;
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 = , Valid};
int errno;
void atoiCore(const char *str, bool minus, long long &num)
{
while( '\0' != *str ){
cout<<"str : "<<*str<<endl;
if(*str >= '' && *str <= ''){
num = num * + (*str) - '';
str ++;
if( (minus && -num < INF_MIN) || (!minus && num > INF_MAX)){ //超过int范围
errno = Invalid;
num = ;
return ;
}
}else{ // 非数字字符
errno = Invalid;
num = ;
return ;
}
}
if ( minus )
num = -num;
errno = Valid;
} //负数最小值(-2^31)的补码使用的是 -0的补码 负数最小值的补码使用的是 -0的补码 负数最小值的补码使用的是 -0的补码
int myAtoi(const char* str)
{
assert( NULL != str);
long long num = ; // 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
}

C/C++自实现的函数(memset, memcpy, atoi)的更多相关文章

  1. 访谈将源代码的函数 strcpy/memcpy/atoi/kmp/quicksort

    一.社论 继上一次发表了一片关于參加秋招的学弟学妹们怎样准备找工作的博客之后,反响非常大.顾在此整理一下,以便大家复习.好多源自july的这篇博客,也有非常多是我自己整理的.希望大家可以一遍一遍的写. ...

  2. c++中内存拷贝函数(C++ memcpy)详解

    原型:void*memcpy(void*dest, const void*src,unsigned int count); 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明 ...

  3. 【C语言】编写函数实现库函数atoi,把字符串转换成整形

    //编写函数实现库函数atoi.把字符串转换成整形 #include <stdio.h> #include <string.h> int my_atoi(const char ...

  4. 自己实现内存操作函数memset(),memcmp(),memcpy(),memmove()

    1.memset()内存设置函数(初始化) void *my_memset(void* dest, int c, size_t count) { assert(dest != NULL); char  ...

  5. memset memcpy函数

    memset 函数 1.其头文件为: #include<memory> 或者#include<string> 2.原型    看清是对每个字节,不是其类型 void *mems ...

  6. <cstring>中常用的两个函数memset()和memcpy()

    <cstring>是c++对c中的<string.h>进行了重写,这两个头文件中的函数用法是一样的,所以在用的时候包含哪个头文件都行.下面介绍一下 <cstring> ...

  7. 41.内存函数实现(memcpy,memset,memmove,memicmp,memchr.memccpy)

    memcpy #include <stdio.h> #include <stdlib.h> #include <memory.h> void * mymemcpy( ...

  8. C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码

    extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h>   功能:由src所指内存 ...

  9. 面试必会函数源代码 strcpy/memcpy/atoi/kmp/quicksort

    http://blog.csdn.net/liuqiyao_01/article/details/26967813 二.stl模板函数 1.strcpy char * strcpy( char *st ...

随机推荐

  1. 静态区间第k大(划分树)

    POJ 2104为例[经典划分树问题] 思想: 利用快速排序思想, 建树时将区间内的值与区间中值相比,小于则放入左子树,大于则放入右子树,如果相等则放入左子树直到放满区间一半. 查询时,在建树过程中利 ...

  2. Java使用Memcached和Redis简单示例

    package xmq.study.memcached; import java.io.IOException; import java.net.InetSocketAddress; import n ...

  3. mysql你确定掌握的那些sql语句

    1.创建表 create table test(uid int not null,create_time timestamp default current_timestamp); 即:没有双引号,单 ...

  4. Python - 两个列表(list)组成字典(dict)

    使用zip函数, 把key和value的list组合在一起, 再转成字典(dict). 代码: # -*- coding: utf-8 -*- keys = ['a', 'b', 'c'] value ...

  5. MariaDB 数据库的备份

    1> 备份单个数据库 mysqldump -uroot -plichao123 --database students1 > stundents.sql; 2>查看备份文件 3> ...

  6. datagrid行操作

    //获取第一个被选中的行 var row=$('#dg').datagrid('getSelected'); //获取行对应的索引值 var index=$('#dg').datagrid('getR ...

  7. NPOI2.2.0.0实例详解(十)—设置EXCEL单元格【文本格式】 NPOI 单元格 格式设为文本 HSSFDataFormat

    NPOI2.2.0.0实例详解(十)—设置EXCEL单元格[文本格式] 2015年12月10日 09:55:17 阅读数:3150 using System; using System.Collect ...

  8. C/C++实现正负数四舍五入

    首先我们来看看 (int) 强制类型转换: #include <stdio.h> #include <stdlib.h> int main(){ int a = (int)(- ...

  9. 后台进程管理工具---supervisor

    supervisor是一个linux下的进程管理工具,有时须要开发一些后台服务类的程序.这类程序通常不能由于意外挂掉.所以最好能在出现意外挂掉的情况下可以重新启动,继续服务. 之前我一直採用创建dae ...

  10. Mac OS X 10.10下Versions crash的问题

    升级完系统.Versions由于兼容性到问题,各种闪退,网上搜索了一下.知乎到一个帖子提到了暂时解决的方法,例如以下: Blackpixel 正在研究此崩溃的修复方案.暂时解决方式例如以下: 在文本编 ...