一步一步学编程之字符串处理函数(三)
来源:互联网 发布:商标注册查询软件 编辑:程序博客网 时间: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;}
- 一步一步学编程之字符串处理函数(三)
- 一步一步学编程之字符串处理函数(一)
- 一步一步学编程之字符串处理函数(二)
- 一步一步学编程之Python(三)
- (三)、一步一步学GTK+之布局
- (三)、一步一步学GTK+之布局
- 一步一步学python(三) - 使用字符串
- 一步一步学android控件(之三) —— Button
- 笨鸟先飞学编程系列之三 函数
- 一步一步学Remoting之三:复杂对象
- 一步一步学Remoting之三:复杂对象
- 一步一步学Remoting之三:复杂对象
- 一步一步学Remoting之三:复杂对象
- 一步一步学Remoting之三:复杂对象
- 一步一步学Remoting之三:复杂对象
- 一步一步学Remoting之三:复杂对象
- 一步一步学编程之Python(一)
- 一步一步学编程之Python(二)
- 数学之路(3)-机器学习(4)-综合应用-K均值算法与欧氏距离
- Java自带的Logger
- java环境变量设置
- Papers Manager
- 自勉
- 一步一步学编程之字符串处理函数(三)
- logic.c:1:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘<’ token
- Eclipse+Python 配置 (Win7 64bit)
- Generalized linear models and linear classification
- EPANET 2.0 用户手册中二进制结果文件结构说明错误
- 怎样设置Win7共享
- Redis rio
- Pomodairo,番茄工作法-应用篇
- Android手机桌面客户端任务项同步方案