C字符串处理函数的实现

  1. C字符串处理函数的实现(Linux)  
  2. #include <stddef.h>  
  3. char * ___strtok = NULL;  
  4.   
  5. char * strcpy(char * dest,const char *src)  
  6. {  
  7.     char *tmp = dest;  
  8.   
  9.     while ((*dest++ = *src++) != '\0')  
  10.         /* nothing */;  
  11.         return tmp;  
  12. }  
  13.   
  14. char * strncpy(char * dest,const char *src,size_t count)  
  15. {  
  16.     char *tmp = dest;  
  17.   
  18.     while (count-- && (*dest++ = *src++) != '\0')  
  19.         /* nothing */;  
  20.   
  21.         return tmp;  
  22. }  
  23.   
  24. char * strcat(char * dest, const char * src)  
  25. {  
  26.     char *tmp = dest;  
  27.   
  28.     while (*dest)  
  29.         dest++;  
  30.     while ((*dest++ = *src++) != '\0')  
  31.         ;  
  32.     return tmp;  
  33. }  
  34.   
  35. char * strncat(char *dest, const char *src, size_t count)  
  36. {  
  37.     char *tmp = dest;  
  38.     if (count) {  
  39.         while (*dest)  
  40.             dest++;  
  41.         while ((*dest++ = *src++)) {  
  42.             if (--count == 0)  
  43.                 break;  
  44.         }  
  45.     }  
  46.   
  47.     return tmp;  
  48. }  
  49. int strcmp(const char * cs,const char * ct)  
  50. {  
  51.     register signed char __res;  
  52.   
  53.     while (1) {  
  54.         if ((__res = *cs - *ct++) != 0 || !*cs++)  /*is !*cs++ necessary? incase more cmp*/  
  55.             break;  
  56.     }  
  57.   
  58.     return __res;  
  59.  
  60. int mystrcmp(const char *s1,const char *s2)
    {
        while(*s1!='\0'&&*s2!='\0'&&(*s1==*s2)) s1++,s2++;
        return (*s1)-(*s2);
    }
  61.   
  62. int strncmp(const char * cs,const char * ct,size_t count)  
  63. {  
  64.     register signed char __res = 0;  
  65.   
  66.     while (count) {  
  67.         if ((__res = *cs - *ct++) != 0 || !*cs++)  
  68.             break;  
  69.         count--;  
  70.     }  
  71.   
  72.     return __res;  
  73. }  
  74.   
  75. char * strchr(const char * s,char c)  
  76. {  
  77.     for(; *s != c; ++s)  
  78.         if (*s == '\0')  
  79.             return NULL;  
  80.     return (char *) s;  
  81. }  
  82.   
  83. size_t strlen(const char * s)  
  84. {  
  85.     const char *sc;  
  86.   
  87.     for (sc = s; *sc != '\0'; ++sc)  
  88.         /* nothing */;  
  89.         return sc - s;  
  90. }  
  91.   
  92. size_t strnlen(const char * s, size_t count)  
  93. {  
  94.     const char *sc;  
  95.   
  96.     for (sc = s; *sc != '\0' && count--; ++sc)  
  97.         /* nothing */;  
  98.         return sc - s;  
  99. }  
  100.   
  101. size_t strspn(const char *s, const char *accept)  
  102. {  
  103.     const char *p;  
  104.     const char *a;  
  105.     size_t count = 0;  
  106.   
  107.     for (p = s; *p != '\0'; ++p) {  
  108.         for (a = accept; *a != '\0'; ++a) {  
  109.             if (*p == *a)  
  110.                 break;  
  111.         }  
  112.         if (*a == '\0')  
  113.             return count;  
  114.         ++count;  
  115.     }  
  116.   
  117.     return count;  
  118. }  
  119.   
  120. char * strpbrk(const char * cs,const char * ct)  
  121. {  
  122.     const char *sc1,*sc2;  
  123.   
  124.     for( sc1 = cs; *sc1 != '\0'; ++sc1) {  
  125.         for( sc2 = ct; *sc2 != '\0'; ++sc2) {  
  126.             if (*sc1 == *sc2)  
  127.                 return (char *) sc1;  
  128.         }  
  129.     }  
  130.     return NULL;  
  131. }  
  132.   
  133. char * strtok(char * s,const char * ct)  
  134. {  
  135.     char *sbegin, *send;  
  136.   
  137.     sbegin  = s ? s : ___strtok;  
  138.     if (!sbegin) {  
  139.         return NULL;  
  140.     }  
  141.     sbegin += strspn(sbegin,ct);  
  142.     if (*sbegin == '\0') {  
  143.         ___strtok = NULL;  
  144.         return( NULL );  
  145.     }  
  146.     send = strpbrk( sbegin, ct);  
  147.     if (send && *send != '\0')  
  148.         *send++ = '\0';  
  149.     ___strtok = send;  
  150.     return (sbegin);  
  151. }  
  152.   
  153. void * memset(void * s,char c,size_t count)  
  154. {  
  155.     char *xs = (char *) s;  
  156.   
  157.     while (count--)  
  158.         *xs++ = c;  
  159.   
  160.     return s;  
  161. }  
  162.   
  163. char * bcopy(const char * src, char * dest, int count)  
  164. {  
  165.     char *tmp = dest;  
  166.   
  167.     while (count--)  
  168.         *tmp++ = *src++;  
  169.   
  170.     return dest;  
  171. }  
  172. void * memcpy(void * dest,const void *src,size_t count)  
  173. {  
  174.     char *tmp = (char *) dest, *s = (char *) src;  
  175.   
  176.     while (count--)  
  177.         *tmp++ = *s++;  
  178.   
  179.     return dest;  
  180. }  
  181.   
  182. void * memmove(void * dest,const void *src,size_t count)  
  183. {  
  184.     char *tmp, *s;  
  185.   
  186.     if (dest <= src) {  
  187.         tmp = (char *) dest;  
  188.         s = (char *) src;  
  189.         while (count--)  
  190.             *tmp++ = *s++;  
  191.     }  
  192.     else {  
  193.         tmp = (char *) dest + count;  
  194.         s = (char *) src + count;  
  195.         while (count--)  
  196.             *--tmp = *--s;  /*12345678*/  
  197.     }     /*12345678*/  
  198.   
  199.     return dest;  
  200. }  
  201.   
  202. int memcmp(const void * cs,const void * ct,size_t count)  
  203. {  
  204.     const unsigned char *su1, *su2;  
  205.     signed char res = 0;  
  206.   
  207.     for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)  
  208.         if ((res = *su1 - *su2) != 0)  
  209.             break;  
  210.     return res;  
  211. }  
  212.   
  213. /* 
  214. * find the first occurrence of byte 'c', or 1 past the area if none 
  215. */  
  216. void * memscan(void * addr, unsigned char c, size_t size)  
  217. {  
  218.     unsigned char * p = (unsigned char *) addr;  
  219.   
  220.     while (size) {  
  221.         if (*p == c)  
  222.             return (void *) p;  
  223.         p++;  
  224.         size--;  
  225.     }  
  226.     return (void *) p;  
  227. }  
  228.   
  229. void main(void)  
  230. {  
  231.     return;  
  232. }  
  233.   
  234. 补充strstr  
  235. char *  
  236. strstr (const char *haystack, const char *needle)  
  237. {  
  238.     char *result = (char *)NULL;  
  239.     if ((haystack != (char *)NULL) && (needle != (char *)NULL))  
  240.     {  
  241.         register int i;  
  242.         int hl = strlen (haystack);  
  243.         int nl = strlen (needle);  
  244.         for (i = 0; i < (hl - nl); i++)  
  245.             if (strncmp (haystack + i, needle, nl) == 0)  
  246.             {  
  247.                 result = haystack + i;  
  248.                 break;  
  249.             }  
  250.     }  
  251.     return (result);  
  252. }  
  253. 还有 加州大学的:  
  254. char *strstr(const  char *string, const  char *substring)  
  255. {    
  256.     const char  *a,  *b;    
  257.   
  258.     b = substring;    
  259.     if (*b == 0)     
  260.     {    
  261.         return  (char*)string;    
  262.     }    
  263.     for( ; *string != 0; string += 1)  
  264.     {  
  265.         if (*string !=  *b)     
  266.         {    
  267.             continue;    
  268.         }    
  269.         a = string;    
  270.         while ((*a++ == *b++) && (*b != 0) );  
  271.   
  272.         if (*b == 0)  
  273.         {  
  274.             return (char*) string;  
  275.         }  
  276.         b = substring;  
  277.     }  
  278. }  
  279. 最后是AT&T:  
  280. extern char*  
  281. strstr(register const char* s1, register const char* s2)  
  282. {  
  283.     register int        c1;  
  284.     register int        c2;  
  285.     register const char*    t1;  
  286.     register const char*    t2;  
  287.     if (s2)  
  288.     {  
  289.         if (!*s2)  
  290.             return (char*)s1;  
  291.         c2 = *s2++;  
  292.         while (c1 = *s1++)  
  293.             if (c1 == c2)  
  294.             {  
  295.                 t1 = s1;  
  296.                 t2 = s2;  
  297.                 do  
  298.                 {  
  299.                     if (!*t2)  
  300.                         return (char*)s1 - 1;  
  301.                 } while (*t1++ == *t2++);  
  302.             }  
  303.     }  
  304.     return 0;  
  305. }  
  306. --------------------------------------------------------------------------  
  307. http://blog.csdn.net/wzbob/archive/2006/11/10/1377600.aspx  
  308. c和汇编实现 一些基本字符串处理函数  
  309. 1. 将一个字符串(src)拷贝到另一个字符串(dest),直到遇到NULL 字符后停止。  
  310. char *strcpy (char *dest, const char *src)  
  311. {  
  312.     _asm  
  313.     {  
  314.         pushf  
  315.             mov esi,src  
  316.             mov edi,dest  
  317.             cld    
  318. l1: lodsb   
  319.     stosb    
  320.     test al,al   
  321.     jne l1   
  322.     popf  
  323.     }      
  324.     return dest;     
  325. }  
  326.   
  327.   
  328. 2.拷贝源字符串count 个字节到目的字符串。  
  329. char *strncpy (char *dest, const char *src, int count)  
  330. {  
  331.     _asm{  
  332.         pushf  
  333.             mov esi,src  
  334.             mov edi,dest  
  335.             mov ecx,count  
  336.             cld    
  337. l1: dec ecx   
  338.     js l2    
  339.     lodsb   
  340.     stosb    
  341.     test al,al   
  342.     jne l1    
  343.     rep stosb   
  344. l2: popf  
  345.     }  
  346.     return dest;     
  347. }  
  348.   
  349. 3.将源字符串拷贝到目的字符串的末尾处。  
  350. char *strcat (char *dest, const char *src)  
  351. {  
  352.     _asm {  
  353.         pushf  
  354.             mov esi,src  
  355.             mov edi,dest  
  356.             xor al,al  
  357.             mov ecx,0xffffffff  
  358.             cld  // 清方向位。  
  359.             repne scasb    
  360.             dec edi    
  361. l1: lodsb   
  362.     stosb    
  363.     test al,al   
  364.     jne l1   
  365.     popf  
  366.     }  
  367.     return dest;     
  368. }  
  369.   
  370. 4.将源字符串的count 个字节复制到目的字符串的末尾处,最后添一空字符。  
  371. char *strncat (char *dest, const char *src, int count)  
  372. {  
  373.     _asm {  
  374.         pushf  
  375.             mov esi,src  
  376.             mov edi,dest  
  377.             xor al,al  
  378.             mov ecx,0xffffffff  
  379.             cld    
  380.             repne scasb   
  381.             dec edi   
  382.             mov ecx,count   
  383. l1: dec ecx  
  384.     js l2   
  385.     lodsb    
  386.     stosb   
  387.     test al,al   
  388.     jne l1    
  389. l2: xor al,al   
  390.     stosb    
  391.     popf  
  392.     }  
  393.     return dest;    
  394. }  
  395.   
  396. 5. 将一个字符串与另一个字符串进行比较。  
  397. int strcmp (const char *csrc, const char *ct)  
  398. {  
  399.     _asm{  
  400.         pushf  
  401.             mov edi,csrc  
  402.             mov esi,ct  
  403.             cld    
  404. l1: lodsb   
  405.     scasb    
  406.     jne l2   
  407.     test al,al   
  408.     jne l1    
  409.     xor eax,eax   
  410.     jmp l3   
  411. l2: mov eax,1   
  412.     jl l3    
  413.     neg eax   
  414. l3: popf  
  415.     }  
  416. }  
  417.   
  418. ------------------------------------------------------------------------------------  
  419. 1. strlen(),计算字符串长度   
  420. int strlen(const char string)   
  421. {   
  422.     int i=0;   
  423.     while(string[i]) i++;   
  424.     return i;   
  425. }   
  426. 2. strcpy(), 字符串拷贝.   
  427. char *strcpy(char *destination, const char *source)   
  428. {   
  429.     while(*destinaton++=*source++);   
  430.     return (destination-1);   
  431. }   
  432. 3. strcat(), 字符串的连接.   
  433. char *strcat(char *target,const char *source)   
  434. {   
  435.     char *original=target;   
  436.     while(*target) target++; // Find the end of the string   
  437.     while(*target++=*source++);   
  438.     return(original);   
  439. }   
  440. 4. streql(), 判断两个字符串是否相等.   
  441. int streql(char *str1,char *str2)   
  442. {   
  443.     while((*str1==*str2)&&(*str1))   
  444.     {   
  445.         str1++;   
  446.         str2++;   
  447.     }   
  448.     return((*str1==NULL)&&(*str2==NULL));   
  449. }   
  450. 5. strchr(), 在字符串中查找某个字符.   
  451. char *strchr(const char *string,int letter)   
  452. {   
  453.     while((*string!=letter)&(*string))   
  454.         string++;   
  455.     return (string);   
  456. }   
  457. 6. chrcnt(), 计算某个字符在字符串中出现的次数.   
  458. int chrcnt(const char *string,int letter)   
  459. {   
  460.     int count=0;   
  461.     while(*string)   
  462.         if(*string==letter)count++;   
  463.     return count;   
  464. }   
  465. 7. strcmp(), 判断两个字符串是否相等.   
  466. int strcmp(const char *str1,const char *str2)   
  467. {   
  468.     while((*str1==*str2)&&(*str1))   
  469.     {   
  470.         str1++;   
  471.         str2++;   
  472.     }   
  473.     if((*str1==*str2)&&(!*str1)) //Same strings   
  474.         return o;   
  475.     else if((*str1)&&(!*str2)) //Same but str1 longer   
  476.         return -1;   
  477.     else if((*str2)&&(!*str1)) //Same but str2 longer   
  478.     else   
  479.     return((*str1>*str2)?-1:1);   
  480. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值