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--;
}
}
}