1 memcmp ( ) /* -- C语言库函数源代码 - */ 2 /* 3 Compares count bytes of memory starting at buffer1 and buffer2 and find if equal or which one is first in lexical order. 4 比较内存区域buffer1和buffer2的前count个字节。当buffer1 < buffer2时,返回值 < 0;当buffer1 = buffer2时,返回值 0;当buffer1 > buffer2时,返回值 > 0。 5 */ 6 int my_memcmp(const void *buffer1,const void *buffer2,int count) 7 { 8 if (!count) 9 return(0); 10 while ( --count && *(char *)buffer1 == *(char *)buffer2) 11 { 12 buffer1 = (char *)buffer1 + 1; 13 buffer2 = (char *)buffer2 + 1; 14 } 15 return( *((unsigned char *)buffer1) - *((unsigned char *)buffer2) ); 16 } 17 void Print(char * str1,char *str2,int t) 18 { 19 if(t > 0) 20 printf("\n%s Upper Than %s\n",str1,str2); 21 else if(t < 0) 22 printf("\n%s Lower Than %s\n",str1,str2); 23 else 24 printf("\n%s Equal %s\n",str1,str2); 25 26 } 27 int main() 28 { 29 char *str1= "ammana"; 30 char *str2 = "babi"; 31 32 Print(str1,str2,my_memcmp(str1,str2,3)); 33 Print(str2,str1,my_memcmp(str2,str1,3)); 34 Print(str2,str2,my_memcmp(str2,str2,3)); 35 36 system("pause"); 37 return 0; 38 } 39 memchr ( )/* -- C语言库函数源代码 - */ 40 #include <stdlib.h> 41 /* 42 Searches at bufferfor the given character, stopping when characteris first found or cnt bytes have been searched through. 43 从buffer所指内存区域的前count个字节查找字符ch,当第一次遇到字符ch时停止查找。如果成功,返回指向字符ch的指针;否则返回NULL。 44 */ 45 46 void * my_memchr(const void * buffer,int ch,int count) 47 { 48 while ( count && (*(unsigned char *)buffer != (unsigned char)ch) ) 49 { 50 buffer = (unsigned char *)buffer + 1; 51 count--; 52 } 53 return(count ? (void *)buffer : NULL); 54 } 55 int main() 56 { 57 char *str = "ammana_babi"; 58 char * p; 59 char ch; 60 61 ch = '9'; 62 p = (char *)my_memchr(str,ch,strlen(str)+1); 63 if(p == NULL) 64 printf("Can't find the character %c !\n",ch); 65 else 66 printf("Find the character %c !\n",*p); 67 68 ch = 'b'; 69 p = (char *)my_memchr(str,ch,strlen(str)+1); 70 if(p == NULL) 71 printf("Can't find the character %c !\n",ch); 72 else 73 printf("Find the character %c !\n",*p); 74 75 system("pause"); 76 return 0; 77 } 78 memccpy ( ) /* -- C语言库函数源代码 - */ 79 #include <stdlib.h> 80 /* 81 Copies bytes from src to dest until count bytes have been copied,or up to and including the character c, whichever comes first. 82 如果src前n个字节中存在’c’,返回指向字符’c’后的第一个字符的指针;否则返回NULL,src被复制。 83 */ 84 void * my_memccpy(void *dest,const void *src,int c,int count) 85 { 86 while ( count && (*((char *)(dest = (char *)dest + 1) - 1) = 87 *((char *)(src = (char *)src + 1) - 1)) != (char)c ) 88 count--; 89 return(count ? dest : NULL); 90 } 91 /*这个函数的while条件判断写的比较长,看的眼疼,等价与以下写法:*/ 92 void * my_memccpy01(void *dst,const void *src,int c,int count) 93 { 94 while (count) 95 { 96 *(char *)dst = *(char *)src; 97 dst = (char *)dst + 1; 98 if(*(char *)src == (char) c) 99 break; 100 src = (char *)src + 1; 101 count--; 102 } 103 return(count ? dst : NULL); 104 } 105 int main() 106 { 107 char a[12]; 108 char * p; 109 char * str ="ammana_babi"; 110 char ch; 111 112 ch = '9'; 113 p = (char *)my_memccpy01(a,str,ch,strlen(str)+1); 114 if(p == NULL) 115 printf("\nCan't not find character. \n"); 116 else 117 { 118 printf("\nFind the character! \n"); 119 *p= '\0'; 120 } 121 printf("\nThe String which has been copied is:\t"); 122 puts(a); 123 124 printf("************************************"); 125 126 ch = 'b'; 127 p = (char *)my_memccpy01(a,str,ch,strlen(str)+1); 128 if(p == NULL) 129 printf("\nCan't not find character. \n"); 130 else 131 { 132 printf("\nFind the character! \n"); 133 *p = '\0'; 134 } 135 printf("\nThe String which has been copied is:\t"); 136 puts(a); 137 138 system("pause"); 139 return 0; 140 } 141 memmove ( ) /* -- C语言库函数源代码 - */ 142 /* 143 144 memmove() copies a source memory buffer to a destination memory buffer. 145 146 This routine recognize overlapping buffers to avoid propogation.For cases where propagation is not a problem, memcpy() can be used. 147 148 memmove()由src所指定的内存区域赋值count个字符到dst所指定的内存区域。src和dst所指内存区域可以重叠, 149 150 但复制后src的内容会被更改。函数返回指向dst的指针。 151 */ 152 void * my_memmove(void * dst,const void * src,int count) 153 { 154 void * ret = dst; 155 if (dst <= src || (char *)dst >= ((char *)src + count)) 156 { 157 while (count--) 158 { 159 *(char *)dst = *(char *)src; 160 dst = (char *)dst + 1; 161 src = (char *)src + 1; 162 } 163 } 164 else 165 { 166 dst = (char *)dst + count - 1; 167 src = (char *)src + count - 1; 168 while (count--) 169 { 170 *(char *)dst = *(char *)src; 171 dst = (char *)dst - 1; 172 src = (char *)src - 1; 173 } 174 } 175 return(ret); 176 } 177 int main() 178 { 179 char a[12]; 180 puts((char *)my_memmove(a,"ammana_babi",16)); 181 system("pause"); 182 return 0; 183 } 184 memcpy ( ) /* -- C语言库函数源代码 - */ 185 /* 186 187 memcpy() copies a source memory buffer to a destination memory buffer. This routine does NOT recognize overlapping buffers, 188 189 and thus can lead to propogation.For cases where propagation must be avoided, memmove() must be used. 190 memcpy()由src指定内存区域拷贝count个字符到dst所指定的内存区域。src和dst内存区域不能重叠,函数返回指向dst的指针。 191 */ 192 void * my_memcpy(void *dst,const void *src,int count) 193 { 194 void * ret = dst; 195 while (count--) 196 { 197 *(char *)dst = *(char *)src; 198 dst = (char *)dst + 1; 199 src = (char *)src + 1; 200 } 201 return(ret); 202 } 203 int main() 204 { 205 char a[12]; 206 puts((char *)my_memcpy(a,"ammana_babi",16)); 207 system("pause"); 208 return 0; 209 } 210 strnicmp ( ) /* -- C语言库函数源代码 - */ 211 /* 212 Compare the two strings for lexical order. Stops the comparison when the 213 following occurs: (1) strings differ, (2) the end of the strings is reached, 214 or (3) count characters have been compared. For the purposes of the comparison, 215 upper case characters are converted to lower case. 216 字符串比较函数,比较字符串src和dst的前count个字符,但是不区分大小写,大写字母 217 会被转换为小写字母来进行比较。如:"abc_" < "ABCD" ,因为 "_" < "d"。当源字符串 218 大于目标字符串的时候,返回>0;当源字符串等于目标字符串的时候,返回=0。当源字符串 219 小于目标字符串的时候,返回<0; 220 */ 221 int my_strnicmp(const char *dst,const char *src,int count) 222 { 223 int ch1, ch2; 224 do 225 { 226 if ( ((ch1 = (unsigned char)(*(dst++))) >= 'A') &&(ch1 <= 'Z') ) 227 ch1 += 0x20; 228 if ( ((ch2 = (unsigned char)(*(src++))) >= 'A') &&(ch2 <= 'Z') ) 229 ch2 += 0x20; 230 } while ( --count && ch1 && (ch1 == ch2) ); 231 return (ch1 - ch2); 232 } 233 void Print(char * str1,char *str2,int t,int n) 234 { 235 char *p; 236 p = str1; 237 while(*p && (p-str1) < n) printf("%c",*p),p++; 238 if(t > 0) 239 printf("\tUpper Than\t"); 240 241 else if(t < 0) 242 printf("\tLower Than\t"); 243 else 244 printf("\tEqual\t\t"); 245 p = str2; 246 while(*p && (p-str2) < n) printf("%c",*p),p++; 247 printf("\n"); 248 } 249 #define nn 4 250 int main() 251 { 252 char *str1= "ammana"; 253 char *str2 = "babi"; 254 char *str3 = "AMMANA"; 255 char *str4 = "bab_"; 256 257 Print(str1,str2,my_strnicmp(str1,str2,nn),nn); 258 Print(str3,str1,my_strnicmp(str3,str1,nn),nn); 259 Print(str4,str2,my_strnicmp(str3,str2,nn),nn); 260 261 system("pause"); 262 return 0; 263 } 264 265 stricmp ( ) /* -- C语言库函数源代码 - */ 266 /* 267 _stricmp/_strcmpi perform a case-insensitive string comparision. 268 For differences, upper case letters are mapped to lower case. 269 Thus, "abc_" < "ABCD" since "_" < "d". 270 字符串比较函数,比较字符串src和dst,但是不区分大小写, 271 大写字母会被转换为小写字母来进行比较。如:"abc_" < "ABCD" ,因为 "_" < "d"。 272 当源字符串大于目标字符串的时候,返回>0;当源字符串等于目标字符串的时候,返回=0。 273 当源字符串小于目标字符串的时候,返回<0; 274 */ 275 int my_stricmp(const char *dst, const char *src) 276 { 277 int ch1, ch2; 278 do 279 { 280 if ( ((ch1 = (unsigned char)(*(dst++))) >= 'A') &&(ch1 <= 'Z') ) 281 ch1 += 0x20; 282 if ( ((ch2 = (unsigned char)(*(src++))) >= 'A') &&(ch2 <= 'Z') ) 283 ch2 += 0x20; 284 } while ( ch1 && (ch1 == ch2) ); 285 return(ch1 - ch2); 286 } 287 void Print(char * str1,char *str2,int t) 288 { 289 if(t > 0) 290 printf("\n%s Upper Than %s\n",str1,str2); 291 else if(t < 0) 292 printf("\n%s Lower Than %s\n",str1,str2); 293 else 294 printf("\n%s Equal %s\n",str1,str2); 295 } 296 int main() 297 { 298 char *str1= "ammana"; 299 char *str2 = "babi"; 300 char *str3 = "AMMANA"; 301 char *str4 = "bab_"; 302 303 Print(str1,str2,my_stricmp(str1,str2)); 304 Print(str3,str1,my_stricmp(str3,str1)); 305 Print(str4,str2,my_stricmp(str4,str2)); 306 307 system("pause"); 308 return 0; 309 } 310 311 strncmp ( ) /* -- C语言库函数源代码 - */ 312 /* 313 Compares two strings for lexical order. 314 315 The comparison stops after: 316 317 (1) a difference between the strings is found, 318 319 (2) the end of the strings is reached, or 320 321 (3) count characters have been compared. 322 比较字符串first和last的前n个字符。first > last ,>0;first = last,=0;first < last, <0 。 323 */ 324 int my_strncmp(const char *first,const char *last,int count) 325 { 326 if (!count) 327 return(0); 328 while (--count && *first && *first == *last)first++,last++; 329 return( *(unsigned char *)first - *(unsigned char *)last ); 330 } 331 void Print(char * str1,char *str2,int t,int n) 332 { 333 char *p; 334 p = str1; 335 while(*p && (p-str1) < n) printf("%c",*p),p++; 336 if(t > 0) 337 printf("\tUpper Than\t"); 338 339 else if(t < 0) 340 printf("\tLower Than\t"); 341 else 342 printf("\tEqual\t\t"); 343 p = str2; 344 while(*p && (p-str2) < n) printf("%c",*p),p++; 345 printf("\n"); 346 } 347 #define nn 3 348 int main() 349 { 350 char *str1= "ammana"; 351 char *str2 = "babi"; 352 353 Print(str1,str2,my_strncmp(str1,str2,nn),nn); 354 Print(str2,str1,my_strncmp(str2,str1,nn),nn); 355 Print(str2,str2,my_strncmp(str2,str2,nn),nn); 356 357 system("pause"); 358 return 0; 359 } 360 361 strcmp ( ) /* -- C语言库函数源代码 - */ 362 /* 363 STRCMP compares two strings and returns an integer 364 to indicate whether the first is less than the second, 365 the two are equal, or whether the first is greater than the second. 366 Comparison is done byte by byte on an UNSIGNED basis, 367 which is to say that Null (0) is less than any other character (1-255). 368 字符串比较函数,比较字符串source和dest。当源字符串大于目标字符串的时候,返回1; 369 当源字符串等于目标字符串的时候,返回0。当源字符串小于目标字符串的时候,返回-1; 370 */ 371 int my_strcmp(const char *source,const char *dest) 372 { 373 int ret = 0 ; 374 while( ! (ret = *( unsigned char *)source - *(unsigned char *)dest) && *dest) 375 source++, dest++; 376 if ( ret < 0 ) 377 ret = -1 ; 378 else if ( ret > 0 ) 379 ret = 1 ; 380 return(ret); 381 } 382 void Print(char * str1,char *str2,int t) 383 { 384 if(t == 0) 385 printf("\n%s Equal %s\n",str1,str2); 386 else if(t == 1) 387 printf("\n%s Upper Than %s\n",str1,str2); 388 else if(t == -1) 389 printf("\n%s Lower Than %s\n",str1,str2); 390 } 391 int main() 392 { 393 char *str1= "ammana"; 394 char *str2 = "babi"; 395 396 Print(str1,str2,my_strcmp(str1,str2)); 397 Print(str2,str1,my_strcmp(str2,str1)); 398 Print(str2,str2,my_strcmp(str2,str2)); 399 400 system("pause"); 401 return 0; 402 } 403 404 strncpy ( )/* -- C语言库函数源代码 - */ 405 /* 406 Copies count characters from the source string to the destination. 407 If count is less than the length of source,NO NULL CHARACTER is put 408 onto the end of the copied string.If count is greater than the length 409 of sources, dest is padded with null characters to length count. 410 把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。 411 如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束; 412 如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。 413 src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 414 返回指向dest的指针。 415 */ 416 char * my_strncpy( char * dest, const char * source, int count ) 417 { 418 char *p = dest; 419 while (count && (*p++ = *source++)) count--; 420 while(count--) 421 *p++ = '\0'; 422 return(dest); 423 } 424 int main() 425 { 426 char a[20]; 427 puts(my_strncpy(a,"ammana_babi",15)); 428 system("pause"); 429 return 0; 430 } 431 432 strncat ( )/* -- C语言库函数源代码 - */ 433 /* 434 435 Appends at most count characters of the string back onto the end of front, and ALWAYS terminates with a null character.I 436 437 f count is greater than the length of back, the length of back is used instead.(Unlike strncpy, 438 439 this routine does not pad out to count characters). 440 把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。 441 src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 442 返回指向dest的指针。 443 */ 444 char * my_strncat(char *dest,const char *source,int count) 445 { 446 char *p = dest; 447 while (*p) p++; 448 while (count-- && (*p++ = *source++)); 449 *p = '\0'; 450 return(dest); 451 } 452 int main() 453 { 454 char a[20] = "ammana_"; 455 puts(my_strncat(a,"babi",10)); 456 system("pause"); 457 return 0; 458 } 459 460 strcat ( )/* -- C语言库函数源代码 - */ 461 /* 462 Concatenates src onto the end of dest. 463 Assumes enough space in dest. 464 目标指针空间必须有足够的存储空间。 465 */ 466 char * my_strcat ( char * dst, const char * src ) 467 { 468 char * p = dst; 469 while( *p ) p++; 470 while( *p++ = *src++ ) ; 471 return( dst ); 472 }//字符串的连接 473 474 /*当然也可以用下面这种方式:*/ 475 char * my_strcat_01(char * dst,char * src) 476 { 477 char * p = dst + strlen(dst); 478 strcpy(p,src); 479 return dst; 480 } 481 int main() 482 { 483 char str1[] = "ammana_"; 484 char *str2 = "babi"; 485 puts(my_strcat(str1,str2)); 486 system("pause"); 487 return 0; 488 } 489 490 strlen ( )/* -- C语言库函数源代码 - */ 491 /* 492 得到字符串长度。(不含结束符 ‘\0’) 493 */ 494 int my_strlen(const char * str ) 495 { 496 const char *p = str; 497 while( *p++ ) ; 498 return( (int)(p - str - 1) ); 499 } 500 /*当然也可以采用下面的写法。*/ 501 int my_strlen_01 ( const char * str ) 502 { 503 const char *p = str; 504 while( *p ) p++; 505 return( (int)(p - str) ); 506 } 507 int main() 508 { 509 char *str = "ammana_babi"; 510 printf("%d\n",my_strlen(str)); 511 printf("%d\n",my_strlen_01(str)); 512 system("pause"); 513 } 514 515 strcpy ( )/* -- C语言库函数源代码 - */ 516 /* 517 518 下面是strcpy库函数的实现,因为库函数讲究的就是精练、简洁。所以没有其他的异常处理代码。 519 520 主要的异常处理还是交给了函数的使用者, 521 522 在调用前请确认目的和源指针是否都存在(不能为Null),请确认目标指针空间是否大于源字符串的空间。 523 Copies the string src into the spot specified by dest; 524 assumes enough room. 525 目标指针空间必须大于源字符串空间。 526 */ 527 char * my_strcpy(char * dst, const char * src) 528 { 529 char * cp = dst; 530 while( *cp++ = *src++ ) ; 531 return( dst ); 532 } 533 int main() 534 { 535 char a[12]; 536 puts(my_strcpy(a,"ammana_babi")); 537 system("pause"); 538 return 0; 539 }