wordpress企业仿站视频教程,品牌vi形象设计公司,珠海市网站设计公司,上高县建设局网站数据结构——算法之(012)( linux C 所有字符串操作函数实现)题目#xff1a;实现linux C下常用的字符串操作函数题目分析#xff1a;一、面试中可能经常遇到这样的问题#xff1a;比如strcpy、memcpy、strstr二、参考了linux 内核代码#xff0c;对linux大神表示感谢#…数据结构——算法之(012)( linux C 所有字符串操作函数实现)题目实现linux C下常用的字符串操作函数题目分析一、面试中可能经常遇到这样的问题比如strcpy、memcpy、strstr二、参考了linux 内核代码对linux大神表示感谢代码写得相当精致这里拿来与大家分享吧算法实现/** linux/lib/string.c** Copyright (C) 1991, 1992 Linus Torvalds*//** stupid library routines.. The optimized versions should generally be found* as inline code in ** These are buggy as well..** * Fri Jun 25 1999, Ingo Oeser * - Added strsep() which will replace strtok() soon (because strsep() is* reentrant and should be faster). Use only strsep() in new code, please.** * Sat Feb 09 2002, Jason Thomas ,* Matthew Hawkins * - Kissed strtok() goodbye*/#include string_fun.h/*** strnicmp - Case insensitive, length-limited string comparison* s1: One string* s2: The other string* len: the maximum number of characters to compare*/int strnicmp(const char *s1, const char *s2, unsigned int len){/* Yes, Virginia, it had better be unsigned */unsigned char c1, c2;if (!len)return 0;do {c1 *s1;c2 *s2;if (!c1 || !c2)break;if (c1 c2)continue;c1 tolower(c1);c2 tolower(c2);if (c1 ! c2)break;} while (--len);return (int)c1 - (int)c2;}int strcasecmp(const char *s1, const char *s2){int c1, c2;do {c1 tolower(*s1);c2 tolower(*s2);} while (c1 c2 c1 ! 0);return c1 - c2;}int strncasecmp(const char *s1, const char *s2, unsigned int n){int c1, c2;do {c1 tolower(*s1);c2 tolower(*s2);} while ((--n 0) c1 c2 c1 ! 0);return c1 - c2;}/*** strcpy - Copy a %NUL terminated string* dest: Where to copy the string to* src: Where to copy the string from*/char *strcpy(char *dest, const char *src){char *tmp dest;while ((*dest *src) ! \0)/* nothing */;return tmp;}/*** strncpy - Copy a length-limited, %NUL-terminated string* dest: Where to copy the string to* src: Where to copy the string from* count: The maximum number of bytes to copy** The result is not %NUL-terminated if the source exceeds* count bytes.** In the case where the length of src is less than that of* count, the remainder of dest will be padded with %NUL.**/char *strncpy(char *dest, const char *src, unsigned int count){char *tmp dest;while (count){if ((*tmp *src) ! 0)src;tmp;count--;}return dest;}/*** strcat - Append one %NUL-terminated string to another* dest: The string to be appended to* src: The string to append to it*/char *strcat(char *dest, const char *src){char *tmp dest;while (*dest)dest;while ((*dest *src) ! \0);return tmp;}/*** strncat - Append a length-limited, %NUL-terminated string to another* dest: The string to be appended to* src: The string to append to it* count: The maximum numbers of bytes to copy** Note that in contrast to strncpy(), strncat() ensures the result is* terminated.*/char *strncat(char *dest, const char *src, unsigned int count){char *tmp dest;if (count){while (*dest)dest;while ((*dest *src) ! 0){if (--count 0){*dest \0;break;}}}return tmp;}/*** strcmp - Compare two strings* cs: One string* ct: Another string*/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;}/*** strncmp - Compare two length-limited strings* cs: One string* ct: Another string* count: The maximum number of bytes to compare*/int strncmp(const char *cs, const char *ct, unsigned int 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;}/*** strchr - Find the first occurrence of a character in a string* s: The string to be searched* c: The character to search for*/char *strchr(const char *s, int c){for (; *s ! (char)c; s)if (*s \0)return NULL;return (char *)s;}/*** strrchr - Find the last occurrence of a character in a string* s: The string to be searched* c: The character to search for*/char *strrchr(const char *s, int c){const char *p s strlen(s);do {if (*p (char)c)return (char *)p;} while (--p s);return NULL;}/*** strnchr - Find a character in a length limited string* s: The string to be searched* count: The number of characters to be searched* c: The character to search for*/char *strnchr(const char *s, unsigned int count, int c){for (; count-- *s ! \0; s)if (*s (char)c)return (char *)s;return NULL;}/*** skip_spaces - Removes leading whitespace from str.* str: The string to be stripped.** Returns a pointer to the first non-whitespace character in str.*/char *skip_spaces(const char *str){while (isspace(*str))str;return (char *)str;}/*** strim - Removes leading and trailing whitespace from s.* s: The string to be stripped.** Note that the first trailing whitespace is replaced with a %NUL-terminator* in the given string s. Returns a pointer to the first non-whitespace* character in s.*/char *strim(char *s){unsigned int size;char *end;size strlen(s);if (!size)return s;end s size - 1;while (end s isspace(*end))end--;*(end 1) \0;return skip_spaces(s);}/*** strlen - Find the length of a string* s: The string to be sized*/unsigned int strlen(const char *s){const char *sc;for (sc s; *sc ! \0; sc)/* nothing */;return sc - s;}/*** strspn - Calculate the length of the initial substring of s which only contain letters in accept* s: The string to be searched* accept: The string to search for*/unsigned int strspn(const char *s, const char *accept){const char *p;const char *a;unsigned int 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;}/*** strcspn - Calculate the length of the initial substring of s which does not contain letters in reject* s: The string to be searched* reject: The string to avoid*/unsigned int strcspn(const char *s, const char *reject){const char *p;const char *r;unsigned int count 0;for (p s; *p ! \0; p){for (r reject; *r ! \0; r){if (*p *r)return count;}count;}return count;}/*** strpbrk - Find the first occurrence of a set of characters* cs: The string to be searched* ct: The characters to search for*/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;}/*** strsep - Split a string into tokens* s: The string to be searched* ct: The characters to search for** strsep() updates s to point after the token, ready for the next call.** It returns empty tokens, too, behaving exactly like the libc function* of that name. In fact, it was stolen from glibc2 and de-fancy-fied.* Same semantics, slimmer shape. ;)*/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;}/*** memset - Fill a region of memory with the given value* s: Pointer to the start of the area.* c: The byte to fill the area with* count: The size of the area.** Do not use memset() to access IO space, use memset_io() instead.*/void *memset(void *s, int c, unsigned int count){char *xs s;while (count--)*xs c;return s;}/*** memcpy - Copy one area of memory to another* dest: Where to copy to* src: Where to copy from* count: The size of the area.** You should not use this function to access IO space, use memcpy_toio()* or memcpy_fromio() instead.*/void *memcpy(void *dest, const void *src, unsigned int count){char *tmp dest;const char *s src;while (count--)*tmp *s;return dest;}/*** memmove - Copy one area of memory to another* dest: Where to copy to* src: Where to copy from* count: The size of the area.** Unlike memcpy(), memmove() copes with overlapping areas.*/void *memmove(void *dest, const void *src, unsigned int 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;}/*** memcmp - Compare two areas of memory* cs: One area of memory* ct: Another area of memory* count: The size of the area.*/int memcmp(const void *cs, const void *ct, unsigned int 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;}/*** memscan - Find a character in an area of memory.* addr: The memory area* c: The byte to search for* size: The size of the area.** returns the address of the first occurrence of c, or 1 byte past* the area if c is not found*/void *memscan(void *addr, int c, unsigned int size){unsigned char *p addr;while (size){if (*p c)return (void *)p;p;size--;}return (void *)p;}/*** strstr - Find the first substring in a %NUL terminated string* s1: The string to be searched* s2: The string to search for*/char *strstr(const char *s1, const char *s2){unsigned 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;}/*** strnstr - Find the first substring in a length-limited string* s1: The string to be searched* s2: The string to search for* len: the maximum number of characters to search*/char *strnstr(const char *s1, const char *s2, unsigned int len){unsigned int l2;l2 strlen(s2);if (!l2)return (char *)s1;while (len l2){len--;if (!memcmp(s1, s2, l2))return (char *)s1;s1;}return NULL;}/*** memchr - Find a character in an area of memory.* s: The memory area* c: The byte to search for* n: The size of the area.** returns the address of the first occurrence of c, or %NULL* if c is not found*/void *memchr(const void *s, int c, unsigned int n){const unsigned char *p s;while (n-- ! 0){if ((unsigned char)c *p)return (void *)(p - 1);}return NULL;}/*** memchr - Put the string into an integer.* s: The string** returns int which come from s*/int atoi(const char *s){if(!s || ((*s ! -) !isdigit(*s)))return 0;int value 0;const char *t s;char c *s;do{if(isdigit(c))value value*10 c-0;if(s-t0 !isdigit(*s))break;s;}while((c *s) ! \0);return (*t -? -value: value);}/*** memchr - Put the string into an long int.* s: The string** returns long int which come from s*/long atol(const char *s){const char *p skip_spaces(s);if(!p || ((*p ! -) !isdigit(*p)))return 0;long value 0;const char *t p;char c *p;do{if(isdigit(c))value value*10 c-0;if(p-t0 !isdigit(*p))break;p;}while((c *p) ! \0);return (*t -? -value: value);}