itoa、atoi、memcpy等函数实现

来源:互联网 发布:通用域名有什么用 编辑:程序博客网 时间:2024/05/17 22:53

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 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 10个月宝宝厌食怎么办 2个月宝宝厌食怎么办 宝宝吃母乳不长体重怎么办 9个月宝宝不长牙怎么办 3个月宝宝过胖怎么办 宝宝长的很慢怎么办 想一个月瘦20斤怎么办 山药弄胳膊上痒怎么办 手碰山药很痒怎么办 手摸了山药很痒怎么办 手切了山药很痒怎么办 山药弄的身上痒怎么办 疣迪去除疣体怎么办 尖锐湿庞出血了怎么办 尿道口周围烂了怎么办 尖锐湿庞复发了怎么办 宝宝脸上长湿疹怎么办如何治疗 孕妇得尖锐湿庞怎么办 痘痘留下的小坑怎么办 花洒固定座坏了怎么办 脚上起水泡烂了怎么办 月经期吃了芒果怎么办 月经量少又黑怎么办 来月经黑色的血怎么办 月经来的是黑色怎么办 来月经有血块是怎么办 月经又少又黑怎么办 来月经发黑又少怎么办 月经血发黑量少怎么办 做人流后肚子胀怎么办 怀孕见红了肚子不痛怎么办 月经来是黑色的怎么办 怀孕了长了痔疮怎么办 怀孕了有外痔疮怎么办 孕妇长痔疮很痛怎么办 孕9个月尿路感染怎么办 旁边有人尿不出来怎么办 外阴破皮了应该怎么办 脸上长脂肪粒怎么办怎么能消除 挤黑头留下的坑怎么办 长痘留下的坑怎么办