您的位置:首页 > 编程语言 > C语言/C++

模拟实现strcpy,strcmp,等str~系列函数

2017-11-24 21:36 423 查看
//1.实现strcpy
//2.实现strcat
//3.实现strstr
//4.实现strchr
//5.实现strcmp
//6.实现memcpy
//7.实现memmove

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

//1.实现strcpy
char * My_strcpy(char *dst, const char *src)
{
assert(src);
char *ret = dst;
while (*dst++ = *src++)
{
;
}
return ret;
}

//2.实现strcat
char * My_strcat(char *dst, const char *src)
{
assert(dst);
assert(src);
char *ret = dst;
while (*dst)
{
dst++;
}
while (*dst++ = *src++)
{
;
}
return ret;
}

//3.实现strstr
char * My_strstr(const char *dst, const char *src)
{
assert(src);
assert(dst);
char *search = (char *)dst;
char *p = NULL;
while (*search)
{
p = search;
char *substr = (char*)src;
while (*p&&*substr && (*p == *substr))
{
p++;
substr++;
}
if (*substr == '\0')
{
return search;
}
search++;
}
return NULL;
}

//4.实现strchr
char * My_strchr(const char *dst, int ch)
{
assert(dst);
assert(ch);

char* search = (char*)dst;
while (*search)
{
if (*search == ch)
{
return search;
}
search++;
}
return NULL;
}

//5.实现strcmp
int My_strcmp(const char * src, const char * dst)
{
assert(src);
assert(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;
}

//6.实现memcpy(不限制类型)
void * My_memcpy(void * dst, const void * src, size_t num)
{
void * ret = dst;
//从高地址开始拷贝
while (num--)
{
*(char*)dst = *(char *)src;
//(char *)dst++, (char*)src++;
dst = (char *)dst + 1;
src = (char*)src + 1;
}
return ret;
}

//7.实现memmove
void * My_memmove(void * dst, const void * src, size_t num)
{
void *ret = dst;
if (dst<src || ((char *)dst>(char*)src + num))
{
while (num--)
{
*(char*)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char*)src + 1;
}
}
else
{
dst = (char*)dst + num - 1;
src = (char*)src + num - 1;
while (num--)
{
*(char*)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char*)src + 1;
}
}
return ret;
}

int main()
{
char str1[] = "AB";
char str2[] = "EFGH";
char str3[] = "ABCDEFG";
char buffer[] = { 0 };

char *ret = NULL;
char ch = 'E';
printf("str1 : %s   str2 : %s   str3 :%s    ch : %c\n",str1,str2,str3,ch);
printf("\n");

printf("将str1内存中内容拷贝到buffer中:\n");
My_strcpy(buffer, str1);
printf("buffer:%s\n", buffer);
printf("\n");

printf("将str1拼接到str2后面:\n");
My_strcat(str2, str1);
printf("str2:%s\n", str2);
printf("\n");

printf("在str3字符串中找是否含有子串str1,\n找到则输出第一次出现的位置,没找到则输出0\n");
ret=My_strstr(str3, str1);
printf("结果为:%d\n", ret-str3+1);
printf("\n");

printf("在str3字符串中找是否含有字符变量ch,\n找到则输出第一次出现的位置,没找到则输出0\n");
ret = My_strchr(str3, ch);
printf("结果为:%d\n", ret-str3+1);
printf("\n");

printf("将str3与str1比较,大于输出1,小于输出-1,等于输出0\n");
printf("结果为:%d\n", My_strcmp(str3, str1));
printf("\n");

printf("将str1全部字节拷贝到buffer中:\n");
int length = sizeof(str1);
My_memcpy(buffer, str1,length);
printf("buffer:%s\n", buffer);
printf("\n");

printf("将str3从它自己在内存中第3个字节处开始覆盖:\n");
length = sizeof(str3+3-1);
My_memmove(str3, str3+3-1, length);
printf("str3:%s\n",str3);
printf("\n");

fflush(stdin);
getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 strcpy 函数
相关文章推荐