一步一步学编程之字符串处理函数(三)

来源:互联网 发布:商标注册查询软件 编辑:程序博客网 时间:2024/05/01 13:03

一般来说C标准库对字符串的处理效率会高一点,下面是自己在Linux内核中找的一些C库string一些函数实现

学习操作之后有两方面的好处:

一、代码风格和思路会跟着有些变化(我们都是模仿着长大的孩子!)

二、指针的操作不会再那么怕

char *strcpy(char *dest, const char *src){char *tmp = dest;while ((*dest++ = *src++) != '\0')/* nothing */;return tmp;}char *strncpy(char *dest, const char *src, size_t count){char *tmp = dest;while (count) {if ((*tmp = *src) != 0)src++;tmp++;count--;}return dest;}char *strcat(char *dest, const char *src){char *tmp = dest;while (*dest)dest++;while ((*dest++ = *src++) != '\0');return tmp;}int strcmp(const char *cs, const char *ct){unsigned char c1, c2;while (1) {c1 = *cs++;c2 = *ct++;if (c1 != c2)return c1 < c2 ? -1 : 1;if (!c1)break;}return 0;}int strncmp(const char *cs, const char *ct, size_t count){unsigned char c1, c2;while (count) {c1 = *cs++;c2 = *ct++;if (c1 != c2)return c1 < c2 ? -1 : 1;if (!c1)break;count--;}return 0;}char *strstrip(char *s){size_t size;char *end;size = strlen(s);if (!size)return s;end = s + size - 1;while (end >= s && isspace(*end))end--;*(end + 1) = '\0';while (*s && isspace(*s))s++;return s;}size_t strlen(const char *s){const char *sc;for (sc = s; *sc != '\0'; ++sc)/* nothing */;return sc - s;}size_t strspn(const char *s, const char *accept){const char *p;const char *a;size_t count = 0;for (p = s; *p != '\0'; ++p) {for (a = accept; *a != '\0'; ++a) {if (*p == *a)break;}if (*a == '\0')return count;++count;}return count;}char *strpbrk(const char *cs, const char *ct){const char *sc1, *sc2;for (sc1 = cs; *sc1 != '\0'; ++sc1) {for (sc2 = ct; *sc2 != '\0'; ++sc2) {if (*sc1 == *sc2)return (char *)sc1;}}return NULL;}char *strsep(char **s, const char *ct){char *sbegin = *s;char *end;if (sbegin == NULL)return NULL;end = strpbrk(sbegin, ct);if (end)*end++ = '\0';*s = end;return sbegin;}bool sysfs_streq(const char *s1, const char *s2){while (*s1 && *s1 == *s2) {s1++;s2++;}if (*s1 == *s2)return true;if (!*s1 && *s2 == '\n' && !s2[1])return true;if (*s1 == '\n' && !s1[1] && !*s2)return true;return false;}void *memset(void *s, int c, size_t count){char *xs = s;while (count--)*xs++ = c;return s;}void *memcpy(void *dest, const void *src, size_t count){char *tmp = dest;const char *s = src;while (count--)*tmp++ = *s++;return dest;}void *memmove(void *dest, const void *src, size_t count){char *tmp;const char *s;if (dest <= src) {tmp = dest;s = src;while (count--)*tmp++ = *s++;} else {tmp = dest;tmp += count;s = src;s += count;while (count--)*--tmp = *--s;}return dest;}int memcmp(const void *cs, const void *ct, size_t count){const unsigned char *su1, *su2;int res = 0;for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)if ((res = *su1 - *su2) != 0)break;return res;}void *memscan(void *addr, int c, size_t size){unsigned char *p = addr;while (size) {if (*p == c)return (void *)p;p++;size--;}  return (void *)p;}char *strstr(const char *s1, const char *s2){int l1, l2;l2 = strlen(s2);if (!l2)return (char *)s1;l1 = strlen(s1);while (l1 >= l2) {l1--;if (!memcmp(s1, s2, l2))return (char *)s1;s1++;}return NULL;}void *memchr(const void *s, int c, size_t n){const unsigned char *p = s;while (n-- != 0) {        if ((unsigned char)c == *p++) {return (void *)(p - 1);}}return NULL;}


 

 

 

原创粉丝点击