嘿嘿、由于这次的代码比较简单,且思路都大同小异,就不一一写了,看注释吧!
1.实现strcpy
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
//拷贝字符串,直到被拷贝字符串结束
while (*src)
{
*dest++ = *src++;
}
return ret;
}
int main()
{
char str[100] = "abcdef";
char ret[100] = { 0 };
my_strcpy(ret, str);
printf("%s\n", ret);
system("pause");
return 0;
}
2.实现strcat
//实现strcat
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* Strcat(char* str1, char* str2)
{
char* ret = str1;
//将ret指针指向字符串\0之前的最后一字符
while (*ret)
{
ret++;
}
//将str2的字符依次赋值给str1
while ((*ret++ = *str2++) != '\0')
{
;
}
//返回指针str1的首元素地址
return str1;
}
int main()
{
char str1[100] = "hello ";
char str2[] = "world";
Strcat(str1, str2);
printf("%s\n", str1);
system("pause");
return 0;
}
3.实现strstr
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* My_Strstr(const char* str1, const char* str2)
{
char* cp = (char*)str1;
char* substr = (char*)str2;
char* s1 = NULL;
if (*str2 == NULL)
{
return NULL;
}
while (*cp)
{
s1 = cp;
substr = str2;
while (*s1 != '\0' && *substr != '0' && (*s1 == *substr))
{
s1++;
substr++;
}
if (*substr == '\0')
{
return cp;
}
cp++;
}
}
int main()
{
char* str1 = "abcdefg";
char* str2 = "bc";
char* ret = 0;
ret = My_Strstr(str1, str2);
printf("%s\n",ret);
system("pause");
return 0;
}
4.实现strcmp
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int My_Strcmp(const char* str1, const char* str2)
{
int ret = 0;
while (*str2 != '0')
{
//判断字符是否相等,若不相等比较哪个字符较大
ret = (unsigned char*)str1 - (unsigned char*)str2;
str1++;
str2++;
}
if (ret > 0)
{
return 1;
}
else if (ret < 0)
{
return -1;
}
return ret;
}
int main()
{
char* str1 = "ashdg";
char* str2 = "abskd";
printf("%d\n", My_Strcmp(str1, str2));
system("pause");
return 0;
}
5.实现strchr
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int My_Strchr(const char* str, char ch)
{
int count = 0;
//若找到相应字符 返回字符所在位置,应注意的是字符在字符串位置
//要是字符下标+1
while (*str)
{
if (ch == *str)
{
return ++count;
}
count++;
str++;
}
return -1;
}
int main()
{
char str[100] = "abcdefghijklmn";
char ch = 'c';
printf("%d\n", My_Strchr(str, ch));
system("pause");
return 0;
}
6.实现memmove
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void* Memmove(void* dst, const void* src, size_t count)
{
void* ret = dst;
//俩种方法,一种正常拷贝,另一种避免字符串内存冲突,造成拷贝错误
if (dst <= src || (char*)dst >= ((char*)src + count))
{
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
else
{
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return ret;
}
int main()
{
char str1[100] = "hello world";
char str2[100] = { 0 };
printf("%s\n", Memmove(str2, str1, 11));
system("pause");
return 0;
}
7.实现memcpy
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* My_Memcpy(char* str1, char* str2, size_t n)
{
char* ret = str1;
while (n--)
{
*str1++ = *str2++;
}
return ret;
}
int main()
{
char str1[100] = "abcdefg";
char str2[100] = { 0 };
My_Memcpy(str2, str1, 3);
printf("%s\n", str2);
system("pause");
return 0;
}
额外加strncmp、strncoy、strncat
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* my_strncpy(char* arr1, const char* arr2, int n)
{
char* ret = arr1;
//将arr2的前n个字符加在arr1后面
while (n--)
{
*arr1++ = *arr2++;
}
return ret;
}
int my_strncmp(const* arr1, const char*arr2, int n)
{
int count = 0;
for (int i = 0; i < n; i++)
{
//判断字符相等
if (*arr1 != *arr2)
{
count++;
}
arr1++;
arr2++;
}
if (n != count)
{
return 0;
}
else
{
return 1;
}
}
char* my_strncat(char* arr1, const char* arr2, int n)
{
char* ret = arr1;
//将指针arr1指向\0之前的最后一个字符
while (*++arr1)
{
;
}
//将arr2前n的字符加在arr1后面
while (n--)
{
*arr1++ = *arr2++;
}
return ret;
}
int main()
{
char arr1[100] = "hello";
char arr2[100] = "world";
char* ret3 = my_strncat(arr1, arr2, 5);
printf("%s\n", ret3);
int ret2 = my_strncmp(arr1, arr2, 5);
printf("%d\n", ret2);
char* ret = my_strncpy(arr2, arr1, 5);
printf("%s\n", ret);
system("pause");
return 0;
}