练习day—16

今天我们来补充 实现一些string.h库中的字符串函数

实现strchr

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

char *my_strchr(const char* str, int c )
{
	char* ret = (char*)str;
	while(*ret)
	{
		if(*ret == c)
			return ret;
		else
			ret++;
	}
	return NULL;
}

int main()
{
	char str[1025] = "my name is lili";
	char *p = my_strchr(str, 's');
	puts(p);
	return 0;
}

实现strcmp

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int my_strcmp(const char *str1, const char *str2)
{
	while(*str2 && *str1)
	{
		if(*str1 == *str2)
		{
			str1++;
		    str2++;
		}
		else
			break;
	}
	if((unsigned char)*str1 > (unsigned char)*str2)
		return 1;
	else if((unsigned char)*str1 < (unsigned char)*str2)
		return -1;
	return 0;
}

int main()
{
	char str1[10] = "abcd";
	char str2[10] = "efgh";
	printf("%d\n",my_strcmp(str1, "abcde"));
	printf("%d\n",my_strcmp(str2, str1));
	printf("%d\n",my_strcmp(str1, "abcd"));
	return 0;
}

实现strstr

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

char* my_strstr(const char* p1, const char* p2)
{
	while(*p1)
	{
		char* r1 =(char*)p1;
		char* r2 =(char*)p2;
		if(*p1 == *p2)
		{
			while(*p2)
			{
				p1++;
				p2++;
				if((*p1 != *p2)&&(*p2 != '\0'))
				{
					p2 = r2;
					break;
				}
				else if(*p2 == '\0')
					return r1;
			}
		}
		p1++;
	}
	return NULL;
}

int main()
{
	char a1[1025] = "my name is lili";
	char a2[1025] = "name";
	char *pch = my_strstr(a1, a2);
	printf("%s\n",pch);
	return 0;
}

实现memcpy

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void* my_memcpy(void * dst, void * src, size_t count)
{
	void * ret = dst;
	while(count--)
	{
		*(char *)dst = *(char *)src;
		dst = (char *)dst + 1;
		src = (char *)src + 1;
	}
	return ret;
}

int main()
{
	char str1[20] = "my name is lili";
	char str2[20] = {0};
	my_memcpy(str2, str1, 10);
	printf("%s\n",str2);
	return 0;
}

实现memmove

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
 
void* my_memmove(void* dst,const void* src,size_t count)
{
    void* ret = dst;
    //dst <= src表示,如果dst在src的前面,从前往后复制不会覆盖src中还没有复制的内容

    if (dst <= src || (char*)dst >= ((char*)src + count))
    {
        //从前往后复制,则不会出现覆盖src中没有复制的内容
        while(count--)
        {
            *(char*)dst = *(char*)src; //char类型指针,表示一个字节一个字节的复制
            dst = (char*)dst + 1; //移动一个字节
            src = (char*)src + 1;
        }
    }
    else
    {
        //从后往前复制,则不会出现覆盖src中没有复制的内容
        dst = (char*)dst + count - 1;//移动到末尾
        src = (char*)src + count - 1;
        while(count--)
        {
            *(char*)dst = *(char*)src;
            dst = (char*)dst - 1; //移动一个字节
            src = (char*)src - 1;
        }
    }
    //返回dst的头指针,还方便左值操作。
    //如:ptstr = memmove(ptstr,src,count); cout << memmove(ptstr,src,count);
    return ret; 
}

int main()
{
	char str1[1024] = "abcdefghijk";
	char str2[1024] = "abcdefghijk";
	memmove(str1, str1+3, 8);//defghijkijk
	my_memmove(str2, str2+3, 8);//defghijkijk
	puts(str1);
	puts(str2);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值