1.实现strlen
2.实现strcpy
3.实现strcat#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
int mystrlen(const char *str)//模拟实现求字符串长度函数。
{
int count = 0;
assert(str);
while (*str++)
{
count++;
}
return count;
}
char *mystrcpy(char *arr, const char *str)//模拟实现字符串拷贝函数。
{
char *ret = arr;
assert(arr);
assert(str);
while (*arr++ = *str++)
{
;
}
return ret;
}
char *mystrcat(char *arr, const char *str1) //模拟实现字符串拼接函数。
{
char *ret = arr;
assert(arr);
assert(str1);
while (*arr)
{
arr++;
}
while (*arr++ = *str1++)
{
;
}
return ret;
}
int main()
{
char str[] = { "abcde" };
char arr[64];
char str1[] = { "1234" };
printf("字符串长度:%d\n", mystrlen(str));
printf("拷贝字符串:%s\n", mystrcpy(arr, str));
printf("连接字符串:%s\n", mystrcat(arr, str1));
system("pause");
return 0;
}
4.实现strstr
#include<stdio.h>
#include<assert.h>
char *mystrstr(const char *arr, const char *str2)//模拟实现查找字符串功能。
{
assert(arr&&str2);
char *n = arr;
char *s1, *s2;
if (!(*str2))
{
return arr;
}
while (*n)
{
s1 = n;
s2 = str2;
while ((s1) && (s1) && (*s1==*s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return n;
}
n++;
}
return NULL;
}
int main()
{
char str1[] = { "ABCDE" };
char str2[] = { "BC2" };
char *ret = mystrstr(str1, str2);
if (ret != NULL)
{
printf("%s\n", ret);
}
else
{
printf("NO FIND\n");
}
system("pause");
return 0;
}
5.实现strchr
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
char *mystrchr(const char *arr, char ch)
{
assert(arr);
while (*arr)
{
if (*arr == ch)
{
return arr;
}
arr++;
}
return 0;
}
int main()
{
char arr[] = "abcdef";
char ch = 0;
printf("请输入要查的字符:");
scanf("%c", &ch);
printf("%s\n", mystrchr(arr, ch));
system("pause");
return 0;
}
6.实现strcmp
int mystrcmp(const char * src, const char * dst)
{
int ret = 0;
while (!(ret = *(unsigned char *)src - *(unsigned char
*)dst) && *dst)
++src, ++dst;
if (ret < 0)
ret = -1;
else if (ret > 0)
ret = 1;
return(ret);
}
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "abcde";
char str[] = "abc";
printf("%d\n", mystrcmp(arr, str));
system("pause");
return 0;
}
7. 实现memcpy
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void * my_memcpy(void * dst, const void * src, int count)
{
void *ret = dst;
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return ret;
}
int main()
{
char p[] = "abcdef";
//char q[] = "abcdef";
char *a = "fghj";
my_memcpy(p, a, 2);
//memcpy(q, a, 2);
printf("%s\n", p);
//printf("%s\n", q);
system("pause");
return 0;
}
8.实现memmove
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *my_memmove(void *dest, const void *src, int n)
{
/*因为char类型为1字节,所以将数据转化为char*
进行操作。并不是因为操作的对象是字符串*/
char* pdest = (char *)dest;
const char* psrc = (const char *)src;
assert(dest);
assert(src);
if (pdest <= psrc&&pdest >= psrc + n)//正常情况下从前向后拷贝
{
while (n--)
{
*pdest = *psrc;
}
}
else //当出现内存覆盖时从后向前拷贝
{
while (n--)
{
*(pdest + n) = *(psrc + n);
}
}
return dest;
}
int main()
{
char arr[10] = "abcdefg";
char arr0[10] = "abcdefg";
char arr1[10] = { 0 };
my_memmove(arr + 2, arr, 4);
my_memmove(arr1, arr0, 4);
printf("内存覆盖情况:%s\n", arr + 2);
printf("正常情况:%s\n", arr1);
system("pause");
return 0;
}