C语言字符串函数

 

strlen

求字符串长度

 size_t strlen ( const char * str );

字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')

参数指向的字符串必须要以'\0'结束

注意参数的返回值为szie_t ,是无符号的

代码模拟实现:


size_t my_strlen(const char*str)
{
	size_t count = 0;
	while (*str)
	{
		count++;
		str++;
	}

	return count;
}

 

二,strcp

char* strcpy(char * destination, const char * source );

源字符串必须是以'\0'结束

会将源字符串中的'\0'拷贝到目标空间

目标空间必须足够大,以确保能存放源字符串

目标空间必须可变

char *my_strcpy(char * dest, const char *src)
{
	char* ret = dest;
	assert(dest !=NULL);
	assert(src !=NULL);
	while ( (*dest++) = (*src++))
	{
	    ;
	}
	return ret;
}

 

三,strcmp

int strcmp ( const char * str1, const char * str2 );

第一个字符串大于第二个字符串,则返回大于0的数字

第一个字符串等于第二个字符串,则返回0

第一个字符串小于第二个字符串,则返回小于0的数字

int my_strcmp (const char * src, const char * dst)
{
int ret = 0 ;
assert(src != NULL);
assert(dest != NULL);
while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
   {
       ++src, ++dst;
   }
if ( ret < 0 )
   {
       ret = -1 ;
   }
else if ( ret > 0 )
   {
     ret = 1 ;
   }
return( ret );
}

 

四,strstr

char * strstr ( const char *str2, const char * str1);

返回str1中第一次出现str2的指针,如果str2不是str1的一部分,则返回空指针。

匹配过程不包括终止的空字符,但它在此停止。

char *my_strstr(char *str1, const char *str2)
{
	char * cp = (char*)str1;
	char *s1;
	char *s2;
	if (!*str2)
	{
		return ((char*)str1);
	}
	while (*cp)
	{
		s1 = cp;
		s2 = (char*)str2;
		while ( *s1 && *s2 && (*s1-*s2))
		{
			s1++;
			s2++;
		}
		if (!*s2)
		{
			return (cp);
		}
		cp++;
	}
	return (NULL);
}

 

五,memcpy

void * memcpy ( void * destination, const void * source, size_t num );

函数memcpy从source的位置开始后复制num字节的数据到destination的内存位置

这个函数在遇到'\0'的时候并不会停下来

如果source和destination有任何的重叠,复制的结果都是未定义的。

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

六,memmove

void * memmove ( void * destination, const void * source, size_t num );

和memcpy的差别就是memmove函数处理的源内存块和目标内存块的是可以重叠的

如果源空间和目标空间出现重叠,就得使用memmove函数处理

void * my_memmove(void * dst, const void * src, size_t count)
{
	void * ret = dst;
	if (dst <= src || (char *)dst >= ((char *)src + count)) {
		
		while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst + 1;
			src = (char *)src + 1;
		}
	}
	else {
		
		dst = (char *)dst + count - 1;
		src = (char *)src + count - 1;
		while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst - 1;
			src = (char *)src - 1;
		}
	}
	return(ret);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值