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++) != '\0'); 10 11 return res; 12 } 13 14 int main() 15 { 16 char *src = "0123456789"; 17 char dest[11]; 18 printf("%s\n", src); 19 char *res = mystrcpy(dest, src); 20 printf("%s\n", 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++) != '\0') && (i++<size)); 11 12 *(res + size) = '\0'; 13 14 return res; 15 } 16 17 int main() 18 { 19 char *src = "0123456789"; 20 printf("%s\n", src); 21 char dest[5]; 22 char *res = mystrncpy(dest, src, 4); 23 printf("%s\n", 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++) != '\0') 10 ++len; 11 12 return len; 13 } 14 15 int main() 16 { 17 char *str = "0123456789"; 18 int len = mystrlen(str); 19 printf("%d\n", 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 == '\0') 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\n", len); 16 17 return 0; 18 }
4、memcpy
memcpy 和 strncpy 最大的区别是 memcpy不会遇到 '\0' 结束拷贝 。
(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) = '\0'; 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\n", 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) = '\0'; 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\n", 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\n", src); 19 char dest[5]; 20 void *buf = (char*)dest; 21 char *res = (char *)(mymemset(buf, 'a', 5)); 22 printf("%s\n", 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 != '\0') 9 ++dest; 10 while (*src != '\0') 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\n", 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 != '\0') 9 ++dest; 10 while ((*src != '\0')&&(size--)) 11 *dest++ = *src++; 12 *dest = '\0'; 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\n", 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\n", 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\n", 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 != '\0' && (*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\n", res); 21 22 return 0; 23 }