zoukankan      html  css  js  c++  java
  • 手写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++)!='')   ;
    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!='') str1++;  
    6     while(*str2!='') *str1++ = *str2++;  
    7     *str1 = '';  
    8     return pt;  
    9 }  
  • 相关阅读:
    sublime text
    php 实例说明 socket通信机制
    nusaop 关于webService
    vim操作集合
    gitHud设置公钥
    redis在window安装并启动
    百度云api 添加标注
    微信小程序bindTap获取对应值
    Java导出excel表
    linux 常用命令
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/8059294.html
Copyright © 2011-2022 走看看