重写strstr、strcpy、memcpy、memset、atof算法

  1 #include<stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <ctype.h>
  5 #include <math.h>
  6 
  7 char *Mystrstr(const char *string, const char *strCharSet)
  8 {
  9     if (NULL == string)
 10     {
 11         return (char *)string;
 12     }
 13     if (NULL == strCharSet)
 14     {
 15         return NULL;
 16     }
 17     int nLen1 = strlen(string);
 18     int nLen2 = strlen(strCharSet);
 19 
 20     for (int i = 0; i < nLen2; i++)
 21     {
 22         for (int j = 0; j <nLen1; j++)
 23         {
 24             if (strCharSet[i] == string[j])
 25             {
 26                 int nPos = j;
 27                 while ( (i < nLen2) &&(strCharSet[i] == string[j]))
 28                 {
 29                     i++;
 30                     j++;
 31                 }
 32                 if (i == nLen2)
 33                 {
 34                     return (char *)&string[nPos];
 35                 }
 36                 i = nPos;
 37             }
 38         }
 39     }
 40     return NULL;
 41 }
 42 
 43 char *Mystrcpy( char *strDestination, const char *strSource )
 44 {
 45     if (strDestination == NULL && strDestination == NULL)
 46     {
 47         exit(0);
 48     }
 49     
 50     while (*strSource != '\0')
 51     {
 52         *strDestination++ = *strSource++;
 53     }
 54     *strDestination = '\0';
 55     return strDestination;
 56 }
 57 
 58 void *Mymemset( void *dest, int c, size_t count )
 59 {
 60     char *pszDest = (char *)dest;
 61     if (pszDest == NULL)
 62     {
 63         exit(0);
 64     }
 65     if (0 == count)
 66     {
 67         return dest;
 68     }
 69     for (size_t i = 0; i < count; i++)
 70     {
 71         *pszDest++ = c;
 72     }
 73     return dest;
 74 }
 75 
 76 void* MyMemcpy( void *dest, const void *src, int nCount )
 77 {
 78     if (NULL == dest || src == NULL)
 79     {
 80         return NULL;
 81     }
 82     char *pszDest = (char *)dest;
 83     const char *pszSrc = (char *)src;
 84     
 85 
 86     if (pszDest > pszSrc && pszDest < pszSrc + nCount)
 87     {//有重复(pszDest的位置 在pszSrc里面)
 88         for (int i = nCount - 1; i >= 0; i--)
 89         {//从后往前拷贝
 90             pszDest[i] = pszSrc[i];
 91         }
 92     }
 93     else
 94     {
 95         for (int i = 0; i < nCount; i++)
 96         {
 97             pszDest[i] = pszSrc[i];
 98         }
 99     }
100     return dest;
101 }
102 
103 
104 
105 double Myatof( const char *string )
106 {
107     bool IsNegative = false;
108     bool IsInt = true;
109     double dblResult = 0;
110     int i = 1;
111     while (*string != '\0')
112     {
113         switch(*string) {
114             case ' ':
115                 string++;
116                 break;
117             case '-':
118                 IsNegative = true;
119                 string++;
120                 break;
121             case '+':
122                 IsNegative = false;
123                 string++;
124                 break;
125             case '.':
126                 IsInt = false;
127                 string++;
128                 break;
129             default:
130                 if (IsInt)
131                 {
132                     dblResult = dblResult*10 + (*string - '0');
133                     string++;
134                 }
135                 else
136                 {
137                     dblResult += (*string - '0') / pow(10, i++); 
138                     string++;
139                 }
140                 break;
141          }//end_of_switch
142         
143     }//end_of_while
144     
145     return IsNegative? -dblResult : dblResult;
146 }
147 
148 
149 int main()
150 {
151     char szBuf[21];
152     memset(szBuf, 0, sizeof(szBuf));
153     for (int i = 0; i < 20; i++)
154     {
155         szBuf[i] = 'a' + i;
156     }
157     MyMemcpy(&szBuf[10], &szBuf[2], 4);
158     printf("%s\n", szBuf);
159     return 0;
160 }

 

posted @ 2018-03-06 08:55  NoThx  阅读(567)  评论(0编辑  收藏  举报