手写atoi、strcpy、strcat
一:实现atoi函数
1 #include<iostream> 2 3 using namespace std; 4 5 int atoi_my(const char *str) 6 { 7 int s=0; 8 bool falg=false; 9 10 while(*str==' ') 11 { 12 str++; 13 } 14 15 if(*str=='-'||*str=='+') 16 { 17 if(*str=='-') 18 falg=true; 19 str++; 20 } 21 22 while(*str>='0'&&*str<='9') 23 { 24 s=s*10+*str-'0'; 25 str++; 26 if(s<0) 27 { 28 s=2147483647; 29 break; 30 } 31 } 32 return s*(falg?-1:1); 33 }
二、实现strcpy函数:char *strcpy(char *dst, const char *src);
如果不考虑内存重叠:
1 char* strcpy(char* dst,const char* src) 2 { 3 assert(dst!=NULL&&src!=NULL); 4 char* res=dst; 5 while((*dst++=*src++)!='\0') ; 6 return res; 7 }
上面的实现没有考虑内存重叠,调用 char str[10]="abc"; my_strcpy(str+1,str); 会出错。然而调用系统的strcpy函数程序正常运行,打印str结果为“aabc”!可见系统strcpy函数的实现不是这样的。
strcpy的正确实现应为:
1 char *my_strcpy(char *dst,const char *src) 2 { 3 assert(dst != NULL); 4 assert(src != NULL); 5 char *ret = dst; 6 memcpy(dst,src,strlen(src)+1); 7 return ret; 8 }
memcpy函数实现时考虑到了内存重叠的情况,可以完成指定大小的内存拷贝,函数memcpy函数的实现:
1 void * my_memcpy(void *dst,const void *src,unsigned int count) 2 { 3 assert(dst); 4 assert(src); 5 void * ret = dst; 6 if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝 7 { 8 while(count--) 9 { 10 *(char *)dst = *(char *)src; 11 dst = (char *)dst + 1; 12 src = (char *)src + 1; 13 } 14 } 15 else //源地址和目的地址重叠,高字节向低字节拷贝 16 { 17 dst = (char *)dst + count - 1; 18 src = (char *)src + count - 1; 19 while(count--) 20 { 21 *(char *)dst = *(char *)src; 22 dst = (char *)dst - 1; 23 src = (char *)src - 1; 24 } 25 } 26 return ret; 27 }
三、strcat函数的实现:
1 char *strcat(char *str1, const char *str2) 2 { 3 assert((str1!=NULL)&&(str2!=NULL)) ; 4 char *pt = str1; 5 while(*str1!='\0') str1++; 6 while(*str2!='\0') *str1++ = *str2++; 7 *str1 = '\0'; 8 return pt; 9 }