C++ 实现atoi,memcpy, strcpy

C++ 实现atoi,memcpy, strcpy
是C++ 常见面试题

atoi,要考虑开头有空格,有正负号,以及溢出的情况。

int myAtoi(char * str) {
    if(str==NULL) {
        return 0;
    }
    while(*str==' ') {
        str++;
    }
    bool isPositive=true;
    if(*str=='-') {
        isPositive=false;
        str++;
    } else if(*str=='+') {
        str++;
    }
    long res=0;
    while(*str>='0'&&*str<='9') {
        res=res*10+*str-'0';
        if(res>INT32_MAX) {
            return isPositive ? INT32_MAX : INT32_MIN;
        }
        str++;
    }
    if(!isPositive) {
        res=0-res;
    }
    return res;
}

memcpy ,要考虑两块地址有重叠的情况,若从前往后复制会造成数据丢失。

void* my_memcpy(void *dst, const void *src, size_t size) {
    const char *psrc;
	char * pdst;
    if (dst == NULL || src == NULL || size<=0) 
        return NULL;
    if (dst <= src) {
        psrc = (const char *)src;
        pdst = (char *)dst;
        while (size--) 
            *pdst = *psrc;
            pdst++;
            psrc++;
    } else {
		// 如果可能重叠则从后往前复制
        psrc = (const char *)src + size - 1;
        pdst = (char *)dst + size - 1;
        while (size--) {
            *pdst-- = *psrc--;
		}
    }
    return pdst;
}

类似于memcpy,复制遇到’\0’结束。

void my_strcpy(char * str, char * src) {
    if(str==NULL||src==NULL) {
        return ;
    }
    int len=strlen(src);
    char *re_str;
    char *re_src;
    if(str<src) {
        while(len--) {
            re_str=str;
            re_src=src;
            *re_str++ = *re_src++;
        }
    } else {
        re_str=str+len-1;
        re_src=src+len-1;
        while(len--) {
            *re_str-- = *re_src--;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章