常用字符串函数具体实现以及注意事项

Posted 不倒翁*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用字符串函数具体实现以及注意事项相关的知识,希望对你有一定的参考价值。

1.strlen函数实现及介绍

1.字符串已经 ‘\\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\\0’ 前面出现的字符个数(不包含 ‘\\0’ )。
2.参数指向的字符串必须要以 ‘\\0’ 结束。
3.注意函数的返回值为size_t,是无符号的( 易错 )

int my_strlen(const char* str)
{
	assert(str);
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

2.strcpy函数实现及介绍

char strcpy(chardes,char*src);
将src指向的字符串拷贝到des指向的字符串数组中去,结束符也一同进行拷贝,size参数也可以拷贝制定长度的字符串,建议des为字符数组,下面为实现strcpy函数的具体代码。

char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* head = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return head;
}

3.strcmp函数实现及介绍

int strcmp(const char * str1,const char *str2);
按照ascii码来进行比较,并由函数返回值进行判断
返回0,字符串1等于字符串2,
大于0,字符串1大于字符串2,
小于0,字符串1小于字符串2,

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

4.strcat函数实现及介绍

char * strcat(const *char str1,const *char str2);
将str2指向的字符串连接到str1指向的字符后面,同时会删除str1后面的’\\0’,返回的是str1指向字符串的首地址重点内容

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* head = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return head;
}

5.strstr函数实现及介绍

char* my_strstr(const char* str, const char* sub)
{
	assert(str && sub);
	char* cp = str;
	char* substr = sub;
	char* s1 = NULL;
	if (*sub == '\\0')
		return NULL;
	while (*cp)
	{
		s1 = cp;
		substr = sub;
		while (*s1 && *substr && (*s1 == *substr))
		{
			s1++;
			substr++;
		}
		if (*substr == '\\0')
			return cp;
		cp++;
	}

}

6.memcpy函数实现及介绍

memcpy(void *des, void *src , size_t n);
1.函数memcpy从s的位置开始向后复制num个字节的数据到dest的内存位置。
2.这个函数在遇到 ‘\\0’ 的时候并不会停下来。
3.如果s和dest任何的重叠,复制的结果都是未定义的

void* my_memcpy(void* dest, const void* src, size_t count)
{
	void* head = dest;
	assert(src != NULL && dest != NULL);
	while (count--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src  = (char*)src + 1;
	}
	return head;
}

7.memove函数实现及介绍

void * memmove ( void * dest, const void * src, size_t num );
1.从src复制count字节的字符到dest. 如果src和dest出现重叠, 函数会自动处理.
2.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
3.如果源空间和目标空间出现重叠,就得使用memmove函数处理。

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

以上是关于常用字符串函数具体实现以及注意事项的主要内容,如果未能解决你的问题,请参考以下文章

(笔试常考题)常用字符串函数具体实现以及注意事项

21个常用代码片段

C#常用代码片段备忘

常用的几个JQuery代码片段

IOS开发-OC学习-常用功能代码片段整理

C语言常用转换函数实现原理(源代码)