itoa、atoi、memcpy等函数实现

itoa函数:

void itoa(int value, char* result, int base) {
    if(strlen(result) <= 0) {
        return;
    }
    if(base < 2 || base > 36) {
        *result = '\0';
        return;
    }
    char table[] = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz";
    char* ptr1 = result, *ptr2 = result;
    int temp;
    do {
        temp = value;
        value /= base;
        //注意temp - value * base有可能为负数
        *ptr1++ = table[35 + temp - value * base];
    } while(value);

    if(temp < 0) {
        *ptr1++ = '-';
    }
    *ptr1-- = '\0';
    char c;
    while(ptr1 > ptr2) {
        c = *ptr1;
        *ptr1-- = *ptr2;
        *ptr2++ = c;
    }
}

atoi函数:

int atoi(const char* c) {
    int n = strlen(c);
    if(n <= 0) {
        return 0;
    }
    int p = 0;
    int result = 0;
    if(c[0] == '-' || c[0] == '+') {
        p++;
    }
    while(p < n && c[p] >= '0' && c[p] <= '9') {
        result = 10 * result + (c[p] - '0');
        p++;
    }
    if(c[0] == '-') {
        result = -result;
    }
    return result;
}

memcpy函数:
所在头文件:#include< cstring >
声明:void *memcpy(void *dest, const void *src, size_t n);
功能:从src复制n个字节的内容(可以是任意数据类型)到dest指向的内存中。

void* memcpy(void* dst, void* src, size_t n) {
    if(dst == NULL || src == NULL) {
        return NULL;
    }
    char* pDst = (char*)dst;
    char* pSrc = (char*)src;
    //地址重叠且源数据内存在前面
    if(src < dst && (char*)src + n > (char*)dst) {
        while(n >= 0) {
            *(pDst + n) = *(pSrc + n);
            n--;
        }
    } else {
        for(int i = 0; i < n; i++) {
            *(pDst + i) = *(pSrc + i);
        }
    }
    return dst;
}

注意使用size_t是为了提高可移植性,比如有的size_t为long unsigned int。如果传一个负数会将符号位当成数值因此一般是一个很大的数。strcpy函数实现类似。

strstr函数:
头文件:#include < string >
声明:char* strstr(char* str1, char* str2);
功能:于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则返回NULL。

char* strstr(char* str1, char* str2) {
    if(str2 == NULL) {
        return NULL;
    }
    while(str1) {
        int i = 0;
        for(; *(str2 + i) != '\0'; i++) {
            if(*str1 != *(str2 + i)) {
                break;
            }
        }
        if(*(str2 + i) == '\0') {
            return str1;
        }
        str1++;
    }
    return NULL;
}

注意”\0”与NULL是不同的,且当str2 == NULL时需要特殊处理,否则*str2程序会挂掉。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值