自定义实现strcpy、strcmp...

本文详细探讨了如何从头开始自定义实现C语言中的strcpy和strcmp函数,涵盖了内存复制、字符串比较的关键技术和注意事项,助你深入理解字符串操作的本质。
#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <string.h>

char *my_strcpy( char *dst, const char *scr )
{
	char *ret = dst;//保存返回地址

	assert(dst);
	assert(scr);

	while( *dst++ = *scr++ );//实现拷贝

	return ret;
}

char *my_strncpy( char *dst, const char *scr, unsigned int n )
{
	char *ret = dst;
	int i = n - 1;

	assert(dst);
	assert(scr);
	assert( n <= strlen(scr) );
	assert( n <= strlen(dst) );

	//while( i > 0 )//逆序拷贝
	//{
	//	dst++;
	//	scr++;
	//	i--;
	//}

	while( ( n-- > 0 ) && ( *dst++ = *scr++ ) );//逆序拷贝n个
	
	return ret;
}

char *my_strcat( char *dst, const char *scr )
{
	char *ret = dst;

	assert(dst);
	assert(scr);

	while( '\0' != *dst )
		dst++;//找到dst结尾

	while( *dst++ = *scr++ );//实现链接

	return ret;
}

char *my_strncat( char *dst, const char *scr, int n )
{
    char *ret=dst;

    while(*dst)//找到dst结尾
        dst++;

    while( ( n-- > 0 ) && ( *dst++ = *scr++ ) );//拷贝n个
	*dst = '\0';

    return ret;
}

int my_strcmp( const char *dst, const char *scr )
{
	assert(dst);
	assert(scr);
	while( '\0' != *dst && '\0' != *scr )
	{
		if( *dst == *scr )
		{
			dst++;
			scr++;
		}
		else if(*dst > *scr)
		{
			return 1;
		}
		else
		{
			return -1;
		}
	}
	if( *dst != '\0' && *scr == '\0')
	{
		return 1;
	}
	if( *dst == '\0' && *scr != '\0')
	{
		return -1;
	}

	return 0;
}

int my_strncmp( const char *dst, const char *scr, int n )
{
	assert(dst);
	assert(scr);
	while( n>0 && '\0' != *dst && '\0' != *scr )
	{
		if( *dst == *scr )
		{
			dst++;
			scr++;
		}
		else if(*dst > *scr)
		{
			return 1;
		}
		else
		{
			return -1;
		}
		n--;
	}
	if( *dst != '\0' && *scr == '\0')
	{
		return 1;
	}
	if( *dst == '\0' && *scr != '\0')
	{
		return -1;
	}

	return 0;
}

void *my_memcpy( void *dst, const void *scr, int n )
{
	void *ret = dst;
	assert(dst);
	assert(scr);
	if( NULL == dst || NULL == scr )
	{
		return dst;
	}
	while(n--)
	{
		*(char*)dst = *(char*)scr;
		dst = (char*)dst + 1;
		scr = (char*)scr + 1;
	}
	return ret;
}

void *my_memmove( void *dst, const void *src, int n )
{
	char *_dst = (char*)dst;
	char *_src = (char*)src;
	char *ret =_dst;

	assert(dst);
	assert(src);

	if( _src >= _dst || _src+n <= _dst )//从前往后拷贝
	{
		while(n--)
		{
			*_dst = *_src;
			_dst++;
			_src++;
		}
	}
	else
	{
		char *_dst_end = _dst + n - 1;
		char *_src_end = _src + n - 1;
		while (n--)
		{
			*_dst_end = *_src_end;
			_dst_end--, _src_end--;
		}
	}
	return ret;
}

char *mystrstr( const char *str1,const char *str2)
{
	const char *p = str1;
	const char *q = str2;
	const char *s = NULL;

	assert(str1);
	assert(str2);
	if('\0' == *q)//子字符串为空则返回母字符串
	{
		return (char*)p;
	}
	while(*p)
	{
		s = p;
		while( *p && *q && *p == *q )
		{//                                             
			p++;
			q++;
		}
		if('\0' == *q)//子字符串指向‘\0’则说明母字符串包含子字符串
		{
			return (char *)s;
		}
		p = s+1;//否则从母字符串下一个元素比较
		q = str2;
	}
	return NULL;//直至str1指向空时还未找到则返回空
}

int main()
{
	char src[32]="abcdefgh";
	my_memmove(src, src+1, strlen(src) + 1);
	printf("%s\n",src);

	system("pause");
	return 0;
}


【作者:果冻 http://blog.youkuaiyun.com/jelly_9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值