手写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 }  

 

posted on 2017-12-18 19:53  wsw_seu  阅读(412)  评论(0编辑  收藏  举报

导航