- //模拟实现strlen
- #include<stdio.h>
- #include<assert.h>
- int my_strlen(const char* string)
- {
- assert(string != NULL);
- int count = 0;
- while (*string != '\0')
- {
- count++;
- string++;
- }
- return count;
- }
- int main(void)
- {
- char str[]= "abcdef";
- int res = my_strlen(str);
- printf("%d\n", res);
- return 0;
- }
- //模拟strcpy
- #include<stdio.h>
- //#include<string.h>
- #include<assert.h>
- char* my_strcpy(char* str1, const char* str2)
- {
- //判断字符串是否有效
- assert(str1 != NULL&&str2 != NULL);
- //保护参数
- char* pStr1 = str1;
- const char* pStr2 = str2;
- while (*pStr2 != '\0')
- {
- *pStr1++ = *pStr2++;
- }
- *pStr1 = '\0';
- return str1;
- }
- int main(void)
- {
- char ar1[] = "abcdef";
- char ar2[] = "def";
- printf("%s\n", ar1);
- my_strcpy(ar1, ar2);
- printf("%s\n", ar1);
- return 0;
- }
- //模拟实现strcat
- #include<stdio.h>
- //#include<string.h>
- #include<assert.h>
- char* my_strcat(char* str1, const char* str2)
- {
- //判断字符串是否有效
- assert(str1 != NULL&&str2 != NULL);
- //保护参数
- char* pStr1 = str1;
- const char* pStr2 = str2;
- while (*pStr1 != '\0')
- {
- *pStr1++;
- }
- while(*pStr2!='\0')
- {
- *pStr1++=*pStr2++;
- }
- *pStr1 = '\0';
- return str1;
- }
- int main(void)
- {
- char ar1[] = "abcdef";
- char ar2[] = "def";
- printf("%s\n", ar1);
- my_strcat(ar1, ar2);
- printf("%s\n", ar1);
- return 0;
- }
- //模拟实现strcmp
- #include<stdio.h>
- //#include<string.h>
- #include<assert.h>
- int my_strcmp(char* str1, const char* str2)
- {
- //判断字符串是否有效
- assert(str1 != NULL&&str2 != NULL);
- int res=0;
- while(str1!='\0'||str2!='\0')
- {
- if((res=*str1-*str2)!=0)
- {
- break;
- }
- str1++;
- str2++;
- }
- return res;
- }
- int main(void)
- {
- char ar1[] = "abcdef";
- char ar2[] = "def";
- int t=my_strcmp(ar1, ar2);
- printf("%d\n", t);
- return 0;
- }
- //模拟实现strstr(查找子串)
- #include<stdio.h>
- //#include<string.h>
- #include<assert.h>
- #include <stdlib.h>
- const char* my_strstr(const char* str1, const char* str2)
- {
- assert(str1 != NULL && str2 != NULL);//使用断言来判断地址是否合法
- //保护参数(不改变原参数指向位置)
- const char* start = str1;
- const char* tmp = str2;
- const char* check = start;
- while (*start)
- {
- check = start;//标记每次开始查找的地址
- //这个循环是进行字符串1的子字符串和字符串2进行比较
- while (*check == *tmp && *check != '\0' && *tmp != '\0')
- {
- check++;
- tmp++;
- }
- if (*tmp == '\0')
- {
- return start;
- }
- start++;
- tmp = str2;
- }
- return NULL;
- }
- int main(void)
- {
- char ar1[] = "abcdef";
- char ar2[] = "def";
- printf("%s\n", my_strstr(ar1, ar2));
- return 0;
- }
- //模拟实现memcpy
- #include<stdio.h>
- #include<assert.h>
- #include <stdlib.h>
- void* my_memcpy(void *dest, const void *src, size_t count)
- {
- //判断参数是否有效
- assert(dest!=NULL&&src!=NULL);
- //保护参数
- char* str1=(char*)dest;
- const char* str2=(const char*)src;
- while(count-->0)
- {
- *str1++=*str2++;
- }
- return dest;
- }
- int main(void)
- {
- int ar[] = {1,2,3,4,5,6,7};
- int n=sizeof(ar)/sizeof(ar[0]);
- int br[7];
- my_memcpy(br, ar,sizeof(int)*n);
- for(int i=0;i<n;i++)
- {
- printf("%d",br[i]);
- }
- return 0;
- }
- //模拟实现memmove
- #include<stdio.h>
- //#include<string.h>
- #include<assert.h>
- #include <stdlib.h>
- void* my_memmove(void *dest, const void *src, size_t count)
- {
- //判断参数是否有效
- assert(dest!=NULL&&src!=NULL);
- //保护参数
- char* str1=(char*)dest;
- const char* str2=(const char*)src;
- if(str1<=str2||str1>=str2+count)
- {
- while(count-->0)
- {
- *str1++=*str2++;
- }
- }
- else
- {
- str1+=(count-1);
- str2+=(count-1);
- while(count-->0)
- {
- *str1--=*str2--;
- }
- }
- return dest;
- }
- int main(void)
- {
- int ar[] = {1,2,3,4,5,6,7};
- int n=sizeof(ar)/sizeof(ar[0]);
- int br[7];
- my_memmove(br, ar,sizeof(int)*n);
- for(int i=0;i<n;i++)
- {
- printf("%d",br[i]);
- }
- return 0;
- }
常用字符串函数模拟实现
于 2022-01-08 14:49:43 首次发布