有关字符串的一些库函数的模拟实现

1.模拟实现strcpy

strcpy是字符串复制函数char* strcpy(char * destination, const char * source);
将source复制到destination中,会覆盖掉destination中的值,返回一个char* 类型。代码如下:

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

int main()
{
	char dest[100] = { 0 };
	char src[] = "hello world";
	my_strcpy(dest, src);
	printf("%s\n", dest);
	system("pause");
	return 0;
}

模拟实现strcat

strcat字符串连接,产生的效果和strcpy类似,但不会覆盖。
char *strcat(char *strDestination, const char *strSource);
代码如下:

char* my_strcat(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char dest[100] = "hello";
	char src[] = " world";
	my_strcat(dest, src);
	printf("%s\n", dest);
	system("pause");
	return 0;
}

3.模拟实现strcmp

int strcmp(const char *string1, const char *string2);
strcmp是字符串比较大小,比较的原理是比较对应的ASCII码值大小。如果str1和str2的第一个字符串比较出大小则返回值一个int值,如果没有比较出依次向后比较知道比较出结果。
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
代码如下:

int my_strcmp(const char* str1, const char* str2)
{ 
	assert(str1 != NULL);
	assert(str2 != NULL);
	//当两个字符串其中有一个到\0时结束循环
	while (*str1 != '\0' || *str2 != '\0')
	{
		//遍历字符串如果对应元素相等向后移动
		if (*str1 == *str2)
		{
			str1++;
			str2++;
		}
		//如果str1大于str2返回1
		else if (*str1 > *str2)
		{
			return 1;
		}
		//如果str1<str2返回-1
		else
		{
			return -1;
		}
	}
	//如果有其中一个结束判断是哪一个结束
	//str1先结束返回-1,str2先结束返回-2,同时结束返回0
	if (*str1 == '\0' && *str2 == '\0')
	{
		return 0;
	}
	else if (*str1 == '\0' && *str2 != '\0')
	{
		return -1;
	}
	return 1;
}

int main()
{
	char str1[] = "hello";
	char str2[] = "world";
	int ret = my_strcmp(str1, str2);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

4.模拟实现strstr

char *strstr( const char *string, const char *strcharset );
strstr是寻找字符串字串的位置,返回一个地。
代码如下:

char *my_strstr(const char *str, const char *set)
{
	assert(str != NULL);
	assert(set != NULL);
	char* start = (char*)str;
	char* sub = (char*)set;
	char* cp = (char*)str;
	//字符串没有结束就一直执行
	while (*cp)
	{
		//将cp的位置赋给start
		start = cp;
		//从第一次出现相同字符开始遍历两个字符串,判断sub是否是start 中的字串
		while (*start != '\0' && *sub != '\0' && *start == *sub)
		{
			start++;
			sub++;
		}
		//如果是则返回cp
		if (*sub == '\0')
		{
			return cp;
		}
		//如果不是则将sub调回原来的指向
		sub = (char*)set;
		//cp向后一位,继续下一次循环
		cp++;
	}
	//遍历str还是没有找到则返回一个空指针
	return NULL;
}

int main()
{
	char str[] = "hello world";
	char set[] = " wor";
	my_strstr(str, set);
	printf("%s\n", my_strstr(str, set));
	system("pause");
	return 0;
}

4.实现strchr

查找字符串中某字符第一次出现的位置,若没有出现返回null。类似于strstr。
char *strchr(const char *string, int c)

char *my_strchr(const char *str, int c)
{
	assert(str != NULL);
	while ((*str !='\0') && (((char)c) != *str))
	{
		str++;
	}
	if (*str != '\0')
	{
		return str;
	}
	else
	{
		return null;
	}
}

int main()
{
	char str[] = "hello world";
	char c = 0;
	char* ret = null;
	printf("请输入要查找的字符:\n");
	c = getchar();
	ret = my_strchr(str, ((int)c));
	if (ret == null)
	{
		printf("输入有误!\n");
	}
	else
	{
		printf("str: %p\n", str);
		printf("c: %p\n", ret);
		printf("%s\n", ret);
	}
	system("pause");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值