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--;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章