织梦CMS - 轻松建站从此开始!

罗索

C字符串处理函数的实现(Linux)

jackyhwei 发布于 2010-09-25 12:33 点击:次 
C字符串处理函数的实现:strstr,strlen, strcmp, strtok......
TAG:

 

  1. #include <stddef.h>   
  2. char * ___strtok = NULL;   
  3. char * strcpy(char * dest,const char *src)   
  4. {   
  5.     char *tmp = dest;   
  6.     while ((*dest++ = *src++) != '\0')   
  7.         /* nothing */;   
  8.         return tmp;   
  9. }   
  10.  
  11. char * strncpy(char * dest,const char *src,size_t count)   
  12. {   
  13.     char *tmp = dest;   
  14.     while (count-- && (*dest++ = *src++) != '\0')   
  15.         /* nothing */;   
  16.         return tmp;   
  17. }   
  18.  
  19. char * strcat(char * dest, const char * src)   
  20. {   
  21.     char *tmp = dest;   
  22.     while (*dest)   
  23.         dest++;   
  24.     while ((*dest++ = *src++) != '\0')   
  25.         ;   
  26.     return tmp;   
  27. }   
  28.  
  29. char * strncat(char *dest, const char *src, size_t count)   
  30. {   
  31.     char *tmp = dest;   
  32.     if (count) {   
  33.         while (*dest)   
  34.             dest++;   
  35.         while ((*dest++ = *src++)) {   
  36.             if (--count == 0)   
  37.                 break;   
  38.         }   
  39.     }   
  40.     return tmp;   
  41. }   
  42.  
  43. int strcmp(const char * cs,const char * ct)   
  44. {   
  45.     register signed char __res;   
  46.     while (1) {   
  47.         if ((__res = *cs - *ct++) != 0 || !*cs++) 
  48. /*is !*cs++ necessary? incase more cmp*/   
  49.             break;   
  50.     }   
  51.     return __res;   
  52. }   
  53.   
  54. int strncmp(const char * cs,const char * ct,size_t count)   
  55. {   
  56.     register signed char __res = 0;   
  57.     while (count) {   
  58.         if ((__res = *cs - *ct++) != 0 || !*cs++)   
  59.             break;   
  60.         count--;   
  61.     }   
  62.     return __res;   
  63. }   
  64.  
  65. char * strchr(const char * s,char c)   
  66. {   
  67.     for(; *s != c; ++s)   
  68.         if (*s == '\0')   
  69.             return NULL;   
  70.     return (char *) s;   
  71. }   
  72.  
  73. size_t strlen(const char * s)   
  74. {   
  75.     const char *sc;   
  76.     for (sc = s; *sc != '\0'; ++sc)   
  77.         /* nothing */;   
  78.         return sc - s;   
  79. }   
  80.   
  81. size_t strnlen(const char * s, size_t count)   
  82. {   
  83.     const char *sc;   
  84.  
  85.     for (sc = s; *sc != '\0' && count--; ++sc)   
  86.         /* nothing */;   
  87.         return sc - s;   
  88. }   
  89.   
  90. size_t strspn(const char *s, const char *accept)   
  91. {   
  92.     const char *p;   
  93.     const char *a;   
  94.     size_t count = 0;   
  95.  
  96.     for (p = s; *p != '\0'; ++p) {   
  97.         for (a = accept; *a != '\0'; ++a) {   
  98.             if (*p == *a)   
  99.                 break;   
  100.         }   
  101.         if (*a == '\0')   
  102.             return count;   
  103.         ++count;   
  104.     }   
  105.   
  106.     return count;   
  107. }   
  108.   
  109. char * strpbrk(const char * cs,const char * ct)   
  110. {   
  111.     const char *sc1,*sc2;   
  112.   
  113.     for( sc1 = cs; *sc1 != '\0'; ++sc1) {   
  114.         for( sc2 = ct; *sc2 != '\0'; ++sc2) {   
  115.             if (*sc1 == *sc2)   
  116.                 return (char *) sc1;   
  117.         }   
  118.     }   
  119.     return NULL;   
  120. }   
  121.  
  122. char * strtok(char * s,const char * ct)   
  123. {   
  124.     char *sbegin, *send;   
  125.     sbegin  = s ? s : ___strtok;   
  126.     if (!sbegin) {   
  127.         return NULL;   
  128.     }   
  129.     sbegin += strspn(sbegin,ct);   
  130.     if (*sbegin == '\0') {   
  131.         ___strtok = NULL;   
  132.         return( NULL );   
  133.     }   
  134.     send = strpbrk( sbegin, ct);   
  135.     if (send && *send != '\0')   
  136.         *send++ = '\0';   
  137.     ___strtok = send;   
  138.     return (sbegin);   
  139. }   
  140.  
  141. void * memset(void * s,char c,size_t count)   
  142. {   
  143.     char *xs = (char *) s;   
  144.     while (count--)   
  145.         *xs++ = c;   
  146.     return s;   
  147. }   
  148.   
  149. char * bcopy(const char * src, char * dest, int count)   
  150. {   
  151.     char *tmp = dest;   
  152.     while (count--)   
  153.         *tmp++ = *src++;   
  154.     return dest;   
  155. }   
  156.  
  157. void * memcpy(void * dest,const void *src,size_t count)   
  158. {   
  159.     char *tmp = (char *) dest, *s = (char *) src;   
  160.     while (count--)   
  161.         *tmp++ = *s++;   
  162.     return dest;   
  163. }   
  164.  
  165. void * memmove(void * dest,const void *src,size_t count)   
  166. {   
  167.     char *tmp, *s;   
  168.     if (dest <= src) {   
  169.         tmp = (char *) dest;   
  170.         s = (char *) src;   
  171.         while (count--)   
  172.             *tmp++ = *s++;   
  173.     }   
  174.     else {   
  175.         tmp = (char *) dest + count;   
  176.         s = (char *) src + count;   
  177.         while (count--)   
  178.             *--tmp = *--s;  /*12345678*/   
  179.     }     /*12345678*/   
  180.     return dest;   
  181. }   
  182.  
  183. int memcmp(const void * cs,const void * ct,size_t count)   
  184. {   
  185.     const unsigned char *su1, *su2;   
  186.     signed char res = 0;   
  187.     for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)   
  188.         if ((res = *su1 - *su2) != 0)   
  189.             break;   
  190.     return res;   
  191. }   
  192.  
  193. /* 
  194. * find the first occurrence of byte 'c', or 1 past the area if none 
  195. */   
  196. void * memscan(void * addr, unsigned char c, size_t size)   
  197. {   
  198.     unsigned char * p = (unsigned char *) addr;   
  199.     while (size) {   
  200.         if (*p == c)   
  201.             return (void *) p;   
  202.         p++;   
  203.         size--;   
  204.     }   
  205.     return (void *) p;   
  206. }   
  207.  
  208. void main(void)   
  209. {   
  210.     return;   
  211. }   
  212.  
  213.   

补充strstr  

 

  1. char* strstr (const char *haystack, const char *needle)   
  2. {   
  3.     char *result = (char *)NULL;   
  4.     if ((haystack != (char *)NULL) && (needle != (char *)NULL))   
  5.     {   
  6.         register int i;   
  7.         int hl = strlen (haystack);   
  8.         int nl = strlen (needle);   
  9.         for (i = 0; i < (hl - nl); i++)   
  10.             if (strncmp (haystack + i, needle, nl) == 0)   
  11.             {   
  12.                 result = haystack + i;   
  13.                 break;   
  14.             }   
  15.     }   
  16.     return (result);   
  17. }   

还有 加州大学的:  

  1. char *strstr(const  char *string, const  char *substring) 
  2. {     
  3.     const char  *a,  *b;     
  4.     b = substring;     
  5.     if (*b == 0)      
  6.     {     
  7.         return  (char*)string;     
  8.     }     
  9.     for( ; *string != 0; string += 1)   
  10.     {   
  11.         if (*string !=  *b)      
  12.         {     
  13.             continue;     
  14.         }     
  15.         a = string;     
  16.         while ((*a++ == *b++) && (*b != 0) );   
  17.         if (*b == 0)   
  18.         {   
  19.             return (char*) string;   
  20.         }   
  21.         b = substring;   
  22.     }   
  23. }   

最后是AT&T:  

  1. extern char*   
  2. strstr(register const char* s1, register const char* s2)   
  3. {   
  4.     register int        c1;   
  5.     register int        c2;   
  6.     register const char*    t1;   
  7.     register const char*    t2;   
  8.     if (s2)   
  9.     {   
  10.         if (!*s2)   
  11.             return (char*)s1;   
  12.         c2 = *s2++;   
  13.         while (c1 = *s1++)   
  14.             if (c1 == c2)   
  15.             {   
  16.                 t1 = s1;   
  17.                 t2 = s2;   
  18.                 do   
  19.                 {   
  20.                    if (!*t2)   
  21.                       return (char*)s1 - 1;   
  22.                 } while (*t1++ == *t2++);   
  23.             }   
  24.     }   
  25.     return 0;   
  26. }   

  (andylin02)

本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201009/10203.html]
本文出处:CSDN博客 作者:andylin02
顶一下
(0)
0%
踩一下
(1)
100%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容