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