模拟实现strcpy
(strcpy将’\0’也拷贝进去,strncpy则不拷贝)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <string.h>
char *my_strcpy(char *dest, const char *src)
{
char *cp = dest;
assert(dest);
assert(src);
while (*dest++ = *src++)//依次复制
{
;
}
return cp;
}
int main()
{
char a[10] = { 0 };
char *p = "abcdef";
char *ret=my_strcpy(a, p);
printf("%s\n", ret);
system("pause");
return 0;
}
模拟实现strcat
char *my_strcat(char *dest, const char *src)
{
char *cat = dest;//保留返回值位置
assert(dest);
assert(src);
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return cat;
}
int main()
{
char a[12] = "abcdef";
char *p = "123456";
char *ret=my_strcat(a, p);
printf("%s\n", ret);
system("pause");
return 0;
}
模拟实现strstr
找子串,若是,则返回目标串在子串中的位置
没有则返回空指针
char *my_strstr(const char *str, const char *substr)
{
assert(str);
assert(substr);
char *end = str + strlen(str) - strlen(substr) + 1;
char *start = str;
while (start < end)
{
char *substart = substr;//子串开始
char *strstart = start;
while (*substart)
{
if (*substart == *strstart)//指向位置相同
{
substart++, strstart++;
}
else
{
break;
}
}
if (*substart == '\0')//找到
{
return start;
}
start++;
}
}
int main()
{
const char *p = "hello worldhello world";
char *ret = my_strstr(p,"orld");
printf("sub begin:%s\n", ret);
system("pause");
return 0;
}
模拟实现strcmp
int my_strcmp(const char *str1, const char *str2)
{
assert(str1);
assert(str2);
const char *p = str1;
const char *q = str2;
while (*p != '\0' && *q != '\0')
{
if (*p == *q)
{
p++, q++;
}
else if (*p > *q)
{
return 1;
}
else {
return -1;
}
}
if (*p != '\0')
{
return 1;
}
if (*q != '\0')
{
return -1;
}
return 0;
}
int main()
{
const char *str1 = "abcdef";
const char *str2 = "bbcdef";
int ret = my_strcmp(str1, str2);
printf("ret=%d\n", ret);
system("pause");
return 0;
}
模拟实现memcpy
按字节拷贝,可拷贝任意类型
void *my_memcpy(void *dest, const void *src, int count)
{
assert(dest);
assert(src);
char *dest_p = ( char *)dest;
const char *src_p = (const char *)src;
while (count--)
{
*dest_p = *src_p;
dest_p++;
src_p++;
}
return dest;
}
int main()
{
int a[] = {1,2,3,4};
int b[4];
system("pause");
return 0;
}
模拟实现 memmove
void *my_memmove(void *dst, const void *src, int count)
{
assert(dst);
assert(src);
const char *p = (const char *)src;
char *q = ( char *)dst;
if ((char*)src<(char *)dst && (char *)src + count>(char *)dst)//从右往左
{
p = p + count - 1;
q = q + count - 1;
while (count--)
{
*q = *p;
q--;
p--;
}
}
else
{
while (count--)
{
*q = *p;
q++;
p++;
}
}
return dst;
}
int main()
{
char str[64] = "abcdefghij";
my_memmove(str+1, str, strlen(str));
printf("%s\n",str);
system("pause");
return 0;
}