1.模拟实现strcpy(字符串拷贝)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char * my_strcpy(char* dest, const char* src)
{
assert(dest&&src);
char* ret = dest;
while (*dest++=*src++)
{
;
}
return ret;
}
int main()
{
char arr[10] = { 0 };
my_strcpy(arr, "abcde");
printf("%s\n", arr);
system("pause");
return 0;
}
2.模拟实现strlen(字符串长度)
①常规方法:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_strlen(const char *str)
{
assert(str != NULL);//断言
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char *p = "abcdef";
int len = my_strlen(p);
printf("len=%d\n", len);
system("pause");
return 0;
}
②递归
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_strlen( const char *str)
{
assert(str != NULL);
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
int main()
{
char *p = "abcdef";
int len = my_strlen(p);
printf("len=%d\n", len);
system("pause");
return 0;
}
③指针方法
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_strlen(const char *str)
{
const char *ret = str;
assert(str != NULL);
while(*str++!='\0')
{
;
}
/*while (*str != '\0')
{
str++;
}
if (*str == '\0')
{
str++;
}*/
return str - ret-1 ;
}
int main()
{
char *p = "abcdef";
printf("len=%d\n", my_strlen(p));
system("pause");
return 0;
}
3.模拟实现strcat(字符串连接)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char * my_strcat(char* dest, const char* src)
{
assert(dest&&src);
char* ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr[20] = "wscis" ;
my_strcat(arr, "apig");
printf("%s\n", arr);
system("pause");
return 0;
}
4.模拟实现strstr (子字符串在原字符串中第一次出现的位置)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char* my_strstr(const char* str, const char* substr)
{
assert(str&&substr);
const char* s1 = str;
const char* s2 = substr;
const char* cur = str;
while (*cur)
{
s1 = cur;
s2 = substr;
while (*s1 &&*s2 && (*s1 == *s2))//让while循环停下来的条件有三种,每一个都得考虑
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cur;
}
if (*s1 == '\0')
{
return NULL;
}
cur++;
}
return NULL;
}
int main()
{
char *p = "abbbcdef";
char *q = "bbc";
char *ret=my_strstr(p, q);
if (ret != NULL)
{
printf("%s\n", ret);
}
else
{
printf("找不到\n");
}
system("pause");
return 0;
}
5.模拟实现strchr(找字符串中某个字符第一次出现的位置)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char* my_strchr( const char* str,char c )
{
assert(str != NULL);
while (*str!= '\0')
{
if (*str == c)
{
return (char*)str;
}
str++;
}
return NULL;
}
int main()
{
char *p = "abcdefc";
printf("%s\n", my_strchr(p, 'c'));
system("pause");
return 0;
}
6.模拟实现strcmp(字符串连接)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_strcmp(const char* str1, const char*str2)
{
assert(str1&&str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char *p1 = "abcde";
char *p2 = "abcccdfg";
int ret=my_strcmp(p1, p2);
printf("%d\n",ret);
system("pause");
return 0;
}
7.模拟实现memcpy(内存拷贝)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t sz)
{
char* pdest = (char*)dest;
char* psrc = (char*)src;
assert(pdest&&psrc);
unsigned i = 0;
for (i = 0; i < sz;i++)
{
*pdest = *psrc;
pdest++;
psrc++;
}
return dest;
}
int main()
{
char arr1[10] = { 0 };
char arr2[] = "abcde";
my_memcpy(arr1, arr2, 4*sizeof(arr2[0]));
printf("%s\n", arr1);
system("pause");
return 0;
}
8.模拟实现memmove(内存移动)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t sz)
{
void* ret = dest;
assert(dest&&src);
if (dest < src)//正着拷贝
{
while (sz--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else//从后向前拷贝
{
while (sz--)
{
*((char*)dest + sz) = *((char*)src + sz);
}
}
return dest;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8};
my_memmove(arr+2,arr,4*sizeof(arr[0]));
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
system("pause");
return 0;
}