strlen函数的自我实现(这里函数的返回值标准为size_t)
1.计数法
#include<stdio.h>
#include<assert.h>
#include<string.h>
int my_strlen(const char* arr)
{
assert(arr != NULL);
int count = 0;
while (*arr)
{
count++;
arr++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int count=my_strlen(arr);
printf("字符串长度为%d", count);
return 0;
}
2.递归法
#include<stdio.h>
#include<assert.h>
#include<string.h>
int my_strlen(const char* arr)
{
assert(arr != NULL);
if (*arr == 0)
return 0;
else
return 1 + my_strlen(arr+1);
}
int main()
{
char arr[] = "abcdef";
int count=my_strlen(arr);
printf("字符串长度为%d", count);
return 0;
}
3.指针法
#include<stdio.h>
#include<assert.h>
#include<string.h>
int my_strlen(const char* arr)
{
assert(arr != NULL);
char* ret = arr;
while (*arr)
{
arr++;
}
return arr - ret;
}
int main()
{
char arr[] = "abcdef";
int count=my_strlen(arr);
printf("字符串长度为%d", count);
return 0;
}
strcpy函数的自我实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcpy(char* arr1, const char* arr2)
{
assert(arr1);
assert(arr2);
char* ret = arr1;
while (*arr1++ = *arr2++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "abahkwtw";
char arr2[] = "akjnf";
char*ret=my_strcpy(arr1, arr2);
printf("%s", ret);
return 0;
}
strcat函数的自我实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* arr1, const char* arr2)
{
assert(arr1);
assert(arr2);
char* ret = arr1;
while (*arr1!='\0')
{
arr1++;
}
while (*arr1++ = *arr2++)
{
;
}
return ret;
}
int main()
{
char arr1[30] = "anfjl";
char arr2[] = "alfn";
char* ret = my_strcat(arr1, arr2);
printf("%s", ret);
return 0;
}
strcmp函数的自我实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* p1, const char* p2)
{
assert(p1);
assert(p2);
while (*p1 == *p2)
{
if (*p1 == 0)
return 0;
p1++;
p2++;//注意
}
return *p1 - *p2;
}
int main()
{
char* p1 = "sjlsf";
char* p2 = "sjlnf";
int math = my_strcmp(p1, p2);
printf("%d", math);
return 0;
}
strncpy函数的自我实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strncpy(char* p1, const char* p2, size_t count)
{
assert(p1 && p2);
char* ret = p1;
while (count--)
{
*p1++ = *p2++;
}
}
int main()
{
char arr1[30] = { 0 };
char arr2[30] = { 0 };
printf("请输入你本来的语句");
gets(arr1);
printf("请输入你要复制的语句");
gets(arr2);
int count = 0;
printf("请输入你要交换的数量");
scanf("%d", &count);
char* ret=my_strncpy(arr1, arr2,count);
printf("%s\n", ret);
return 0;
}
strncat函数的自我实现
#include<assert.h>
#include<stdio.h>
#include<string.h>
char* my_strncat(char* arr1, const char* arr2, size_t num)
{
char*ret=arr1;
while (*arr1)
{
arr1++;
}
while (num--)
{
*arr1++ = *arr2++;
}
*arr1='\0';
return ret;
}
int main()
{
char arr1[30] = "kla";
char arr2[] = "ajn";
printf("输入你要连接的数量\n");
int num = 0;
scanf("%d", &num);
char*ret=my_strncat(arr1, arr2,num);
printf("结果为%s", arr1);
return 0;
}
strncmp函数的自我实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* p1, const char* p2,size_t count)
{
assert(p1);
assert(p2);
while (*p1 == *p2)
{
count--;
if (count== 0)
return 0;
p1++;
p2++;//注意
}
return *p1 - *p2;
}
int main()
{
char* p1 = "sjlsf";
char* p2 = "sjlnf";
int count = 0;
printf("请输入对比的数字\n");
scanf("%d", &count);
int math = my_strcmp(p1, p2,count);
printf("%d", math);
return 0;
}
strstr函数的自我实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strstr(const char* arr1, const char* arr2)
{
assert(arr1 && arr2);
char* s1 = NULL;
char* s2 = NULL;
char* cur = (char*)arr1;
if (*arr2 == '\0')
return (char*)arr1;
while (*cur)
{
s1 = cur;
s2 = (char*)arr2;
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;
}
cur++;
}
return NULL;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "ghi";
char* ret=my_strstr(arr1, arr2);
if (ret == NULL)
printf("不是");
else
printf("是");
return 0;
}
memcpy函数的自我实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
void*my_memcpy(void* arr2, void* arr1, size_t num)
{
void* ret = arr2;
assert(arr2 && arr1);
//一个字节一个字节往下拿肯定不会错;
while (num--)
{
*((char*)arr2)++ = *((char*)arr1)++;
/*++(char*)arr2;
++(char*)arr1;*/
}
return ret;
}
//c语言标准
//memcpy 只要处理 不重叠的内存拷贝就可以
//memmove 处理重叠的内存拷贝
int main()
{
int arr1[] = {1,2,3,4,5,6,7,8,9,10};
//int arr2[5] = { 0 };
memcpy(arr1+2, arr1, 20);//单位字节
for (int i = 0; i <= 9; i++)
{
printf("%d\n", arr1[i]);
}
return 0;
}
memmove函数的自我实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
void* my_memmove(void* dest, void* src, size_t num)
{
assert(dest && src);
void* ret = src;
if (dest < src)
{
while (num--)
{
*((char*)dest)++ = *((char*)src)++;
}
}
else
{
//src = (size_t)src + num-1;
//dest = (size_t)dest + num-1;//注意
while (num--)
{
/**((char*)(dest))-- = *((char*)(src))--;*/
*((char*)dest + num) = *((char*)src + num);
}
return ret;
}
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//int arr2[5] = { 0 };
my_memmove(arr1+2, arr1, 20);//单位字节
for (int i = 0; i <= 9; i++)
{
printf("%d\n", arr1[i]);
}
return 0;
}
memcmp函数的自我实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
void* my_memcmp(void* p1, const void* p2, size_t count)
{
assert(p1);
assert(p2);
while (*(char*)p1 == *(char*)p2)
{
count--;
if (count== 0)
return 0;
((char*)p1)++;
((char*)p2)++;//注意
}
void* ret = (void*)(*(char*)p1 - *(char*)p2);
return ret;
}
int main()
{
int arr1[] = {1,2,3,4,5};
int arr2[] = { 1,2,3,4,5 };
int ret=my_memcmp(arr1, arr2, sizeof(arr1));
printf("%d\n", ret);
return 0;
}
memset函数的自我实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
void* my_memset(void* str, int c, size_t n)
{
assert(str);
void* ret = str;
while (n--)
{
*((char*)str)++ = c;
}
return ret;
}
int main()
{
int arr[10] = { 0 };
my_memset(arr, 1, 10);
//让十个字节改为1
for (int i = 0; i <= 9; i++)
{
printf("%d", arr[i]);
}
return 0;
}