c语言:模拟实现各种字符串函数

strlen函数:

c语言:模拟实现各种字符串函数_第1张图片

功能:获取到\0之前的的字符个数。 

代码模拟实现函数:

//strlen
//这里用了递归法,
//如abc,1+bc,然后1+1+c,接着1+1+1,最后读取到\0,1+1+1+0,得到结果3。

size_t my_strlen(const char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}
int main()
{
	char arr[] = "abc";
	size_t len = my_strlen(arr);
	printf("%zd\n", len);
	return 0;
}

 


strcpy函数:

c语言:模拟实现各种字符串函数_第2张图片

功能:拷贝一个指定的字符串

代码模拟实现函数: 

//strcpy
char* my_strcpy(char* dest, char* str)
{
	char* ret = dest;
	assert(dest && *str);//断言,如果其中有一个为空指针,停止运行,保护程序
	while (*dest = *str)
	{
		dest++;
		str++;
	}
	return ret;
}
int main()
{
	char arr1[20] = { 0 };//被拷入数组
	char arr2[] = "abcdef";//拷入数组
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

strcmp函数:

c语言:模拟实现各种字符串函数_第3张图片

功能:比较两个字符串的对应的ascll码值大小(从左到右对应的ascll码值大小)

代码模拟实现函数: 

int my_strcmp(const char* s1, const char* s2)
{
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
			return 0;//读取到\0时仍然相等,说明两个字符串完全一样
		s1++;
		s2++;
	}
	return *s1 - *s2;
}
int main()
{
	int ret = my_strcmp("abcdef", "abc");
	if (ret > 0)
		printf("大于\n");
	else if (ret == 0)
		printf("等于\n");
	else
		printf("小于\n");
	return 0;
}

 strcat函数:

c语言:模拟实现各种字符串函数_第4张图片

功能:粘贴两个字符串 

代码模拟函数实现: 

//strcat
char* my_strcat(char* dest, const char* src)
{
    char* ret = dest;
    assert(dest && src);//断言
    //找到目标空间,也就是第一个字符串的结尾的\0
    while (*dest)
    {
        dest++;
    }
    //拷贝
    while (*dest = *src)
    {
        dest++;
        src++;
    }
    return ret;
}
int main()
{
    char arr1[20] = "hello ";
    char arr2[] = "world";
    my_strcat(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

strstr函数: 

c语言:模拟实现各种字符串函数_第5张图片

功能:在较长数组1中看是否能找到较短数组2,如果存在,打印数组1中数组2的字符串起始位置到结束

代码模拟函数实现: 

//strstr
char* my_strstr(char* str1, char* str2)
{
	const char* cur = str1;//记录数组1的起始位置
	const char* s1 = NULL;
	const char* s2 = NULL;//创建两个空指针,用来模拟数组地址的变化
	
	assert(str1 && str2);//断言
	if (*str2 == '\0')
	{
		return (char*)str1;//str2历遍完全部字符了,且符合条件,记录str1的位置
	}
	while (*cur)//进入判断条件,建议画图模拟一下,用abbbbcdef和bbc这两个数组能找出所有可能发生的情况
	{
		s1 = cur;
		s2 = str2;
		while (*s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)cur;//此时,找到符合位置的地址,返回str1此时历遍到的位置
		}
		cur++;
	}
	return NULL;//历遍完全部数组,仍没有找到,说明a数组中不存在符合b数组的字符串
}
int main()
{
	char arr1[]="abcdef";
	char arr2[] = "bcd";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");
	return 0;

}

你可能感兴趣的:(c语言,算法,开发语言,数据结构)