strcpy、strncpy、strlen、memcpy、memset、strcat、strncat、strcmp、strncmp,strchr

1、strcpy

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 char *mystrcpy(char *dest, const char *src)
 5 {
 6     assert((dest != NULL) && (src != NULL));
 7 
 8     char *res = dest;
 9     while ((*dest++ = *src++) != '');
10 
11     return res;
12 }
13 
14 int main()
15 {
16     char *src = "0123456789";
17     char dest[11];
18     printf("%s
", src);
19     char *res = mystrcpy(dest, src);
20     printf("%s
", res);
21 
22     return 0;
23 }

2、strncpy

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 char* mystrncpy(char *dest, const char *src, size_t size)
 5 {
 6     assert((dest != NULL) && (src != NULL));
 7 
 8     char *res = dest;
 9     int i = 0;
10     while (((*dest++ = *src++) != '') && (i++<size));
11 
12     *(res + size) = '';
13 
14     return res;
15 }
16 
17 int main()
18 {
19     char *src = "0123456789";
20     printf("%s
", src);
21     char dest[5];
22     char *res = mystrncpy(dest, src, 4);
23     printf("%s
", res);
24 
25     return 0;
26 }

3、strlen

(1)非递归实现

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 int mystrlen(const char *str)
 5 {
 6     assert(str != NULL);
 7 
 8     int len = 0;
 9     while ((*str++) != '')
10         ++len;
11 
12     return len;
13 }
14 
15 int main()
16 {
17     char *str = "0123456789";
18     int len = mystrlen(str);
19     printf("%d
", len);
20 
21     return 0;
22 }

(2)递归实现

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 int strlenRecur(const char *str)
 5 {
 6     if (str == NULL || *str == '')
 7         return 0;
 8     return strlenRecur(str + 1) + 1;
 9 }
10 
11 int main()
12 {
13     char *str = "0123456789";
14     int len = strlenRecur(str);
15     printf("%d
", len);
16 
17     return 0;
18 }

4、memcpy

 memcpy 和 strncpy 最大的区别是 memcpy不会遇到 '' 结束拷贝 。

(1)version1(不能解决数据区重叠问题):

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 char* mymemcpy1(char *dest, const char *src, size_t size)
 5 {
 6     assert((dest != NULL) && (src != NULL));
 7 
 8     char *res = dest;
 9     while (size)
10     {
11         *(dest++) = *(src++);
12         --size;
13     }
14     *(dest + size) = '';
15 
16     return res;
17 }
18 
19 int main()
20 {
21     char *src = "0123456789";
22     char dest[5];
23     char *res = mymemcpy1(dest, src,4);
24     printf("%s
", res);
25 
26     return 0;
27 }

(2)version2(解决了数据区重叠问题):

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 char *mymemcpy2(char *dest, const char *src, size_t size)
 5 {
 6     assert((dest != NULL) && (src != NULL));
 7     char *res = dest;
 8 
 9     if (dest > src&&dest < (src + size))
10     {
11         dest = dest + size - 1;
12         src = src + size - 1;
13         while (size--)
14             *dest-- = *src--;
15     }
16     else
17         while (size--)
18             *dest++ = *src++;
19     *(dest + size) = '';
20 
21     return res;
22 }
23 
24 int main()
25 {
26     char *src = "0123456789";
27     char dest[5];
28     char *res = mymemcpy2(dest, src,5);
29     printf("%s
", res);
30 
31     return 0;
32 }

 5、memset

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 void *mymemset(void *buf, const char c, size_t size)
 5 {
 6     assert(buf != NULL);
 7     char *res = (char*)buf;
 8     char *str = res;
 9     while (size--)
10         *str++ = c;
11 
12     return res;
13 }
14 
15 int main()
16 {
17     char *src = "0123456789";
18     printf("%s
", src);
19     char dest[5];
20     void *buf = (char*)dest;
21     char *res = (char *)(mymemset(buf, 'a', 5));
22     printf("%s
", res);
23 
24     return 0;
25 }

6、strcat

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 char *mystrcat(char *dest, const char *src)
 5 {
 6     assert((dest != NULL) && (src != NULL));
 7     char *res=dest;
 8     while (*dest != '')
 9         ++dest;
10     while (*src != '')
11         *dest++ = *src++;
12 
13     return res;
14 }
15 
16 int main()
17 {
18     char dest[15] = "123";
19     char *src = "abc";
20     char *res = mystrcat(dest, src);
21     printf("%s
", res);
22 
23     return 0;
24 }

7、strncat

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 char *mystrncat(char *dest, const char *src,size_t size)
 5 {
 6     assert((dest != NULL) && (src != NULL));
 7     char *res=dest;
 8     while (*dest != '')
 9         ++dest;
10     while ((*src != '')&&(size--))
11         *dest++ = *src++;
12     *dest = '';
13 
14     return res;
15 }
16 
17 int main()
18 {
19     char dest[15] = "123";
20     char *src = "abcdef";
21     char *res = mystrncat(dest, src,3);
22     printf("%s
", res);
23 
24     return 0;
25 }

8、strcmp

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 int mystrcmp(const char *str1, const char *str2)
 5 {
 6     assert((str1 != NULL) && (str2 != NULL));
 7     while (*str1&&*str2 && (*str1++ == *str2++));
 8 
 9     return (*str1 - *str2);
10 }
11 
12 int main()
13 {
14     char *str1 = "abcde";
15     char *str2 = "abdf";
16     int res = mystrcmp(str1, str2);
17     printf("%d
", res);
18 
19     return 0;
20 }

9、strncmp

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 int mystrncmp(const char *str1, const char *str2,size_t size)
 5 {
 6     assert((str1 != NULL) && (str2 != NULL));
 7     while (*str1&&*str2 && (*str1++ == *str2++)&&size--);
 8 
 9     return (*str1 - *str2);
10 }
11 
12 int main()
13 {
14     char *str1 = "abcde";
15     char *str2 = "abdfsd";
16     int res = mystrncmp(str1, str2,4);
17     printf("%d
", res);
18 
19     return 0;
20 }

10、strchr

 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 char *mystrchr(const char *str, char c)
 5 {
 6     assert(str != NULL);
 7     while (*str != '' && (*str != c))
 8         ++str;
 9 
10     if (*str == c)
11         return (char*)str;
12     else
13         return NULL;
14 }
15 
16 int main()
17 {
18     char *str = "abcde";
19     char *res = mystrchr(str,'c');
20     printf("%s
", res);
21 
22     return 0;
23 }
原文地址:https://www.cnblogs.com/xidian2014/p/8569758.html