天天看點

Linux核心中常用字元串函數實作

  1. //列舉了部分常用的strcpy,strcmp,strcat,strchr,strstr,strpbrk...  
  2.  char *strcpy(char *dest, const char *src)  
  3. {  
  4.     char *tmp = dest;  
  5.     while ((*dest++ = *src++) != '\0')  
  6.         ;  
  7.     return tmp;  
  8. }  
  9. char *strncpy(char *dest, const char *src, size_t count)  
  10. {  
  11.     char *tmp = dest;  
  12.     while (count) {  
  13.         if ((*tmp = *src) != 0)  
  14.             src++;  
  15.         tmp++;  
  16.         count--;  
  17.     }  
  18.     return dest;  
  19. }  
  20. char *strcat(char *dest, const char *src)  
  21. {  
  22.     char *tmp = dest;  
  23.     while (*dest)  
  24.         dest++;  
  25.     while ((*dest++ = *src++) != '\0')  
  26.         ;  
  27.     return tmp;  
  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++) != 0) {  
  36.             if (--count == 0) {  
  37.                 *dest = '\0';  
  38.                 break;  
  39.             }  
  40.         }  
  41.     }  
  42.     return tmp;  
  43. }  
  44. int strcmp(const char *cs, const char *ct)  
  45. {  
  46.     signed char __res;  
  47.     while (1) {  
  48.         if ((__res = *cs - *ct++) != 0 || !*cs++)  
  49.             break;  
  50.     }  
  51.     return __res;  
  52. }  
  53. int strncmp(const char *cs, const char *ct, size_t count)  
  54. {  
  55.     signed char __res = 0;  
  56.     while (count) {  
  57.         if ((__res = *cs - *ct++) != 0 || !*cs++)  
  58.             break;  
  59.         count--;  
  60.     }  
  61.     return __res;  
  62. }  
  63. char *strchr(const char *s, int c)  
  64. {  
  65.     for (; *s != (char)c; ++s)  
  66.         if (*s == '\0')  
  67.             return NULL;  
  68.     return (char *)s;  
  69. }  
  70. char *strrchr(const char *s, int c)  
  71. {  
  72.        const char *p = s + strlen(s);  
  73.        do {  
  74.            if (*p == (char)c)  
  75.                return (char *)p;  
  76.        } while (--p >= s);  
  77.        return NULL;  
  78. }  
  79. char *strnchr(const char *s, size_t count, int c)  
  80. {  
  81.     for (; count-- && *s != '\0'; ++s)  
  82.         if (*s == (char)c)  
  83.             return (char *)s;  
  84.     return NULL;  
  85. }  
  86. size_t strlen(const char *s)  
  87. {  
  88.     const char *sc;  
  89.     for (sc = s; *sc != '\0'; ++sc)  
  90.         ;  
  91.     return sc - s;  
  92. }  
  93. char *strpbrk(const char *cs, const char *ct)  
  94. {  
  95.     const char *sc1, *sc2;  
  96.     for (sc1 = cs; *sc1 != '\0'; ++sc1) {  
  97.         for (sc2 = ct; *sc2 != '\0'; ++sc2) {  
  98.             if (*sc1 == *sc2)  
  99.                 return (char *)sc1;  
  100.         }  
  101.     }  
  102.     return NULL;  
  103. }  
  104. void *memcpy(void *dest, const void *src, size_t count)  
  105. {  
  106.     char *tmp = dest;  
  107.     const char *s = src;  
  108.     while (count--)  
  109.         *tmp++ = *s++;  
  110.     return dest;  
  111. }  
  112. int memcmp(const void *cs, const void *ct, size_t count)  
  113. {  
  114.     const unsigned char *su1, *su2;  
  115.     int res = 0;  
  116.     for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)  
  117.         if ((res = *su1 - *su2) != 0)  
  118.             break;  
  119.     return res;  
  120. }  
  121. char *strstr(const char *s1, const char *s2)  
  122. {  
  123.     int l1, l2;  
  124.     l2 = strlen(s2);  
  125.     if (!l2)  
  126.         return (char *)s1;  
  127.     l1 = strlen(s1);  
  128.     while (l1 >= l2) {  
  129.         l1--;  
  130.         if (!memcmp(s1, s2, l2))  
  131.             return (char *)s1;  
  132.         s1++;  
  133.     }  
  134.     return NULL;  
  135. }  

    來源: http://blog.csdn.net/willib/article/details/38460691