一些字符和字符串库函数操作模拟实现

Posted Suk_god

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些字符和字符串库函数操作模拟实现相关的知识,希望对你有一定的参考价值。

库函数的模拟实现

模拟实现strlen

原型

size_t strlen ( const char * str );

size_t: unsigned int 无符号整型

模拟实现

//计数器方式
size_t my_strlen1(const char* str)
{
	size_t count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

//不创建临时变量的计数器方式
size_t my_strlen2(const char* str)
{
	if (*str == '\\0')
		return 0;
	else
		return (size_t)(1 + my_strlen2(str + 1));
}

//利用指针-指针方式获取长度
size_t my_strlen3(const char* str)
{
	const char *p = str;
	while (*p)
	{
		p++;
	}
	return (size_t)(p - str);
}

int main()
{
	//strlen(const char * str)-->my_strlen(const char *str)
	const char* str1 = "Hello world!";
	printf("模拟实现strlen函数实例#\\n");
	size_t len1 = my_strlen1(str1);
	printf("The size of this string is %d,from my_strlen1\\n",len1);
	size_t len2 = my_strlen2(str1);
	printf("The size of this string is %d,from my_strlen2\\n", len2);
	size_t len3 = my_strlen3(str1);
	printf("The size of this string is %d,from my_strlen3\\n", len3);

	printf("\\n");
	system("pause");
	return 0;
}

模拟实现strcpy

原型

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

返回值类型为char*,操作过程是将source所指向的的内容拷贝到destination指向的存储单元

模拟实现

//将src的内容拷贝至dest
char * my_strcpy(char *dest, const char *src)
{
	assert(src);
	assert(dest);
	char * begin = dest;
	//只有一个等号,赋值语句,要拷贝就要将所有内容都拷贝进去,包括'\\0'
	while (*dest++ = *src++);
	return begin;
}

int main()
{
	//strcpy(char *dest,const char* src)-->my_strcpy(char *dest,const char* src)
	printf("模拟实现strcpy函数实例#\\n");
	const char *str2 = "Enjoyment!";
	char dest[] = " test Enjoyments ";
	printf("before;%s\\n",dest);
	char * ret1 = my_strcpy(dest, str2);
	printf("after:%s\\n",ret1);
	printf("\\n");

	system("pause");
	return 0;

}

模拟实现strcat

原型

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

模拟实现

char * my_strcat(char *dest, const char *src)
{
	assert(dest);
	assert(src);
	char *ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src++);
	return ret;
}
int main()
{
//char * strcat ( char * destination, const char * source )-->my_strcat(char*dest,const char *src);
	printf("模拟实现strcat函数实例#\\n");
	char dest2[] = "Hello bit!";
	const char *str3 = "Enjoyment";
	char *ret2 = my_strcat(dest2, str3);
	printf("%s\\n",ret2);
	printf("\\n");


	system("pause");
	return 0;

}

来看运行结果;

模拟实现strstr

原型

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

功能:在str1中找到第一次与str2所指内容匹配的位置,然后从这个位置向后输出str1所指向的内容
例如:
char *str1 = “abcdeabcda1234”;
char *str2 = “abcda”
调用strstr()函数之后,返回的就是“abcda1234”

模拟实现

char * my_strstr(const char *stra,const char *strb)
{
	assert(stra);
	assert(strb);
	char *p = (char*)stra;
    char *move_p = p;
    char * sp = (char*)strb;
	if (*strb == '\\0')
		return NULL;

	while (*p)
	{
		move_p = p;
		sp = (char*)strb;
		while (*sp && *sp == *move_p)
		{
			sp++;
			move_p++;
		}
		if (*sp == '\\0')
			return p;
		p++;
	}
}

int main()
{
	
	//char * my_strstr(const char *str1, const char *str2)
	printf("模拟实现strstr函数实例#\\n");
	const char *str4 = "hellobitHelloBit1234";
	const char *str5 = "Hello";
	char *ret3 = my_strstr(str4, str5);
	printf("%s\\n",ret3);

	printf("\\n");

	system("pause");
	return 0;

}

模拟实现strcmp

原型

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

此函数用于比较两个字符串是否相等,若相等返回0,若str1>str2,返回1,若str1<str2,返回值为-1

模拟实现

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

}

int main()
{
	// int my_strcmp(const char * str1, const char * str2)
	printf("模拟实现strcmp函数实例#\\n");
	const char *str6 = "my_strcmp实现";
	const char *str7 = "my_strcmp实现";
	int ret4 = my_strcmp(str6, str7);
	if (ret4 == 0)
		printf("str6=str7\\n");
	else if (ret4 == -1)
		printf("str6<str7\\n");
	else
		printf("str6>str7\\n");
	printf("\\n");
	system("pause");
	return 0;

}

模拟实现memcpy

原型

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

将source所指的内容拷贝到destination所指处,拷贝的大小为num个字节。注意,此函数是按照内存的最小访存单位字节来进行操作的。

模拟实现

void * my_memcpy(void * dest, const void * src, size_t num)
{
	assert(dest);
	assert(src);
	char *_dest = (char *)dest;
	char*_src = (char *)src;

	if (_dest > _src&&_dest < _src + num)
	{
		_dest = _dest + num - 1;
		_src = _src + num - 1;
		while (num--)
		{
			*_dest = *_src;
			_dest--;
			_src--;
		}
	}
	else
	{
		while (num--)
		{
			*_dest = *_src;
			_dest++;
			_src++;
		}
	}
	return dest;
}

int main()
{
	//	void * memcpy(void * dest, const void * src, size_t num)
	printf("模拟实现memcmp函数实例#\\n");
	char str8[64] = "hello bit!";
	const char * str9 = "my_memcpy 函数执行了!";
	my_memcpy(str8, str9, strlen(str9));
	printf("%s\\n",str8);
	system("pause");
	return 0;

}

模拟实现memmove

原型

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

memmove()和memcpy()目前在功能上没有差异。他们两的实现代码一样,在这里就不再展示模拟实现。具体可以参考memcpy的实现代码

以上就是基本的库函数模拟,以后会不定期更新~~
如果对你有所帮助,三连支持走一波儿~

以上是关于一些字符和字符串库函数操作模拟实现的主要内容,如果未能解决你的问题,请参考以下文章

c语言重要库函数解读 和模拟实现————常用字符串库函数

c语言重要库函数解读 和模拟实现————常用字符函数

实现一些字符串操作标准库函数与解决一些字符串笔试问题

实现一些字符串操作标准库函数解决一些字符串问题的总结

实现一些字符串操作标准库函数解决一些字符串问题的总结

#yyds干货盘点# C语言字符串与内存库函数的介绍与模拟实现