总结与字符串有关的模拟实现函数代码

1.strcpy实现字符串的拷贝

char* my_strcpy(char* dest,const char* src)

{

	char* temp = dest;

	assert(src != NULL);

	while(*dest++ = *src++)

	{

		;

	}

	return temp;

}

2.strcat实现字符串的连接

char* my_strcat(char* arr,const char* src)

{

	char* temp = arr;

	assert(src != NULL);

	while(*arr != '\0')

	{

		arr++;

	}

	while(*arr++ = *src++)

	{

		;

	}

	return temp;

}

3.strstr实现子字符串在目标字符串中的查找

char* my_strstr(const char* dest,const char* src)//函数返回找到目标开始匹配且成功的起始位置

{

	const char* s1 = dest;//定义s1让dest备份

	const char* s2 = src;

	const char* ptr = dest;

	assert(src != NULL);



	while(*ptr)//ptr++寻找开始匹配的位置

	{

		s1 = ptr;//记住开始匹配的位置

		s2 = src;//记住子字符串开始的位置

		while(*s1 && *s2 && *s1 == *s2)//有一个条件为假结束

		{

			s1++;

			s2++;

		}

		if(*s2 == '\0')//当s2说明匹配成功 返回目标字符串的开始位置

			return (char*)ptr;

		ptr++;//假设开始匹配却未匹配成功*ptr没有成为'\0'时,ptr加加开始下一轮查找

	}

	return NULL;//没有找到时返回空指针



}

4.strcmp实现字符串的比较

int my_strcmp(const char* dest,const char* src)

{

	assert(dest != NULL);//判断传过来的指针是不是为空

	assert(src != NULL);

	while(*dest == *src)//当src为'\0'时结束,但他的值赋给了dest,

		//所以在循环内部返回0;然后跳出循环

	{

		if(*dest == '\0')

		{

			return 0;

		}

		dest++;src++;

	}

	if(*dest > *src)//不要把判断写在if之后,因为当dest为0时程序没有机会来到最后

	{

		return -1;

	}

	else

	{

		return 1;

	}

}

5.memcpy(也同时实现了memmove)内存的字符拷贝

void* my_memcpy(void* dest,const void* src,int count)

{

	void* temp = dest;

	assert(dest != NULL);

	assert(src != NULL);

	while(count--)

	{

		if(src < dest)//不判断指针的大小即是memcpy,判断指针大小函数便成为了memmove函数。

		*((char*)dest+1) = *((char*)src+1);

		//((char*)dest)++;

		//((char*)src)++;

		else

		{

			*((char*)dest+count) = *((char*)src+count);

		}

	}

	return temp;

}

6.strchr在目标字符串中查找字符

char* my_strchr(const char* dest,const char* src)

{	

	while(*dest)

	{	

		if(*dest == *src)

			return dest;

		dest++;

	}

	return NULL;

	

}

7.strncpy自己定义要拷贝的字符串长度

char* my_strncpy(char* dest,const char* src,int count)

{

	char* ret = dest;	

	assert(src != NULL);

	while(count--)//count来控制循环次数

	{

		*dest++ = *src++;		

	}

	*dest = '\0';//当赋值结束时应当让目标字符串以‘\0’结束

	return ret;

}

8.strncmp自己定义需要比较的字符串长度

int my_strncmp(const char* dest,const char* src,int count)

{

	assert(dest != NULL);

	assert(src != NULL);

	while((*dest == *src) && --count)//必须同时满足俩个条件时才满足

	{

		if(*dest == '\0')//如果*dest为0,说明*src已经结束返回0

			return 0;

		dest++;

		src++;

	}

	return *src-*dest;//直接返回比较结果数字
	
}

9.strncat自己定义需要连接字符串的长度

char* my_strncat(char* dest,const char* src,int count)

{

	

	char* ret = dest;//保存dest的起始位置

	if(count < 0)

		return NULL;//判断假如count输入为负数时

	assert(src != NULL);

	while(*dest != '\0')

	{

		dest++;

	}

	while(count--)

	{

		*dest++ = *src++;		

	}

	*dest = '\0';//当赋值结束时应当让目标字符串以‘\0’结束

	return ret;

}

猜你喜欢

转载自blog.csdn.net/lucky52529/article/details/84067821