函数原型:

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. codevs——2147 数星星

    2147 数星星  时间限制: 3 s  空间限制: 64000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 小明是一名天文爱好者,他喜欢晚上看星星 ...

  2. Property 'sqlMapClient' is required

    继承SqlMapClientDaoSupport类的类里面添加如下代码 @Resource(name = "sqlMapClient") private SqlMapClient ...

  3. linux 虚拟网卡

    linux中可以通过一个物理网卡,模拟出多个虚拟网卡,并在网卡中配置ip. 下面做一个实验. 实验描述: 我们有server A (ip 10.79.148.205),server B (10.79. ...

  4. Jenkins 使用

    Jenkins 安装 Jenkins是用Java语言开发的系统,首先要确定服务器上已经安装JDK或者JRE. 安装方式一 直接运行java –jar Jenkins.war,在浏览器中输入 http: ...

  5. mysql正则表达式及应用

    mysql where子句的模式匹配 今天在应用中遇到了这样的一个问题,有一个字段 t1,其中的值类似于:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2 需要从里面搜索出比如说:第一个 ...

  6. Vue.js 组件的三个 API:prop、event、slot

    组件的构成 一个再复杂的组件,都是由三部分组成的:prop.event.slot,它们构成了 Vue.js 组件的 API.如果你开发的是一个通用组件,那一定要事先设计好这三部分,因为组件一旦发布,后 ...

  7. hdu 1258 Sum It Up (dfs+路径记录)

    pid=1258">Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  8. 【OI】简单的分块

    介绍下简单的分块: 当我们遇到区间类问题的时候,如何保证我们快速而高效地完成操作? 答案是线段树分块. 所谓分块,就是把一个序列分成许多块分别维护.是不是想起了树状数组 这样能大大提高效率: 例如,我 ...

  9. 在linux上处理base64加密和解密

    http://snailwarrior.blog.51cto.com/680306/142472/ 2.从标准输入读取文件内容,base64编码并打印到标准输出 [root@localhost tes ...

  10. POJ 2629:Common permutation

    Common permutation Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5510   Accepted: 168 ...