C语言string常用函数源代码及使用

  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 }

 

转载于:https://www.cnblogs.com/jiangyinglin/p/3247087.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值