memcpy, strcpy, strlen, strcmp, itoa, atoi 的函数实现

不使用库函数,实现 memcpy, strcpy, strlen, strcmp, itoa, atoi.
本文地址 : http://blog.csdn.net/quzhongxin/article/details/48136245

1. memcpy

内存拷贝函数。
函数原型

void *memcpy(void*dest, const void *src, size_t n); // n 为字节数

注意问题:
1. 判断输入地址有效性
2. 将src,dst 指针强制转换成字符型指针,逐字节复制
3. 结束复制的依据是否已经复制了len个字节,而不是’\0’ 或 数据个数
4. 重叠问题,写入 dst 的数据会覆盖 src 未使用的数据时,需要从后往前复制

// 注意问题 1. 输入有效性  2. 重叠问题
void* MyMemcpy(void* dst, const void* src, size_t len) {
    if (dst == NULL || src == NULL || len <= 0)
        return NULL;
    char* pDst = (char*) dst;
    const char* pSrc = (const char*) src;
    if (pDst > pSrc && (pDst-pSrc) < len) {
        // 有重叠,从后向前复制
        for (int i = len-1; i >= 0; i--)
            pDst[i] = pSrc[i];
    } else {
        // 无重叠,从前向后复制
        for (int i = 0; i < len; i++)
            pDst[i] = pSrc[i];
    }
    return dst;
}

2. strcpy

字符串拷贝函数,将 src 的字符拷贝到 dst .
以 ‘\0’为结束标志。

char* MyStrcpy(char* dst, const char* src) {
    if (dst == NULL || src == NULL)
        return dst;
    char* dst_origal = dst;
    while (*dst++ = *src++);
    return dst_origal;
}

3. strlen

统计一个字符串,从起始地址到’\0’的字符 的字符个数(不计’\0’)

size_t MyStrlen(const char* str) {
    if (str == NULL)
        return 0;
    size_t size = 0;
    while (*str++ != '\0')
        size++;
    return size;
};

4. strcmp

C/C++函数,比较两个字符串
设这两个字符串为str1,str2,

  • 若str1==str2,则返回零;
  • 若str1 > str2,则返回正数;
  • 若str1 < str2,则返回负数。
int MyStrcmp(const char* str1, const char* str2) {
    int result = 0;
    assert(str1 != NULL && str2 != NULL);
    while (*str1 && *str2 && *str1 == *str2) {
        str1++;
        str2++;
    }
    return *str1 - *str2;
}

5. atoi

字符串转整型

  • 1 检查输入有效性
  • 2 过滤开始的空格
  • 3 处理正负号
  • 4 累加并检测溢出
// 需要注意 0. 无效输入 1. 空格 2. 正负号 3.溢出
int MyAtoi(const char* str) {
    const int kIntMax = ~((unsigned int)0) >> 1;
    const int kIntMin = -kIntMax - 1;
    if (str == NULL || *str == '\0') {
        cout << "Input Valid" << endl;
        return 0;
    }
    long long result = 0; // 处理溢出
    while (*str == ' ')
        str++;
    bool minus = (*str == '-') ? true : false;
    if (*str == '-' || *str == '+')
        str++;
    while (*str >= '0' && *str <= '9') {
        result = result*10 + (*str - '0');
        if (!minus && result > kIntMax)
            return kIntMax;
        if (minus && -result < kIntMin)
            return kIntMin;
        str++;
    }
    return minus ? -result : result;
}

6. itoa

将整型数据转化为字符串

  1. 检查目标字符串是否为NULL
  2. 处理正负号
  3. 将整型数据的从低位到高位,以字符的形式写入到 temp 字符串
  4. 如果是负数,首位写入’-‘;将 temp 字符串逆序复制到目标字符串
  5. 添加结束字符 ‘\0’
// 先从低位开始将每一个字符写到temp串,再copy到目标字符串
// 需要注意 0. 目标串尾NULL  1. 对0的处理  2. 对负数的处理
char* MyItoa(int num, char* result) {
    if (result == NULL) {
        return NULL;
    }
    char* temp = new char[20];
    bool minus = num < 0 ? true : false;
    if (num < 0) {
        num = -num;
    }
    int i = 0, j = 0;
    // do while 能处理 num = 0
    do {
        temp[i++] = (num % 10) + '0';
        num /= 10;
    } while (num != 0);

    if (minus) {
        result[0] = '-';
        j++;
    }
    while (--i >= 0) {
        result[j++] = temp[i];
    }
    result[j] = '\0';
    delete[]temp;
    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值