模拟实现strlen,strstr,strcmp,strcat,strcpy。

strlen,strstr,strcmp,strcat,strcpy是对于字符串处理的几个简单的库函数,在这片博客中我用my_strlen,my_strstr,my_strcmp,my_strcat,my_strcpy这几个函数来模拟实现一下这几个库函数。

1.strlen():所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

方式一:计数器

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

方式二:递归实现

int my_strlen(const char* str)
{
	assert(str);
	if (*str == "\0")
	{
		return 0;
	}
	else
	{
		return 1 + my_strlen(++str);
	}
}

2.strstr:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

char* my_strstr(const char* str, const char* substr)
{
	assert(str != NULL);
	assert(substr != NULL);
	if (*substr == '\0')     //如果子串为空直接返回源字符串
	{
		return str;
	}
	while (*str)
	{
		const char*s1 = str;
		const char*s2 = substr;
		while (*s1 && *s2 && *s1 == *s2) // *s1和*s2不为'\0'
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')  //只有当*s2 == '\0'时说明子串内已经找完了结束
			{
                return str;   //返回str因为str记录了初始的位置 只有s1和s2在++
	       	}
            str++;
	}
	return NULL;
}

3.strcmp:

比较两个字符串

设这两个字符串为str1,str2,

若str1=str2,则返回零;

若str1<str2,则返回负数;

若str1>str2,则返回正数。

strcmp的实现原理就是将字符串的每个字符进行对比,直到两个字符串都遇到“\0”,否则返回str1-str2;

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}


int main()
{
	char* str1 = "abcef";
	char* str2 = "asssssf";
	int ret = my_strcmp(str1, str2);
	if (ret > 0)
	{
		printf("str1>str2");
	}
	else if (ret == 0)
	{
		printf("str1=str2");
	}
	else
	{
		printf("str1<str2");
	}
	system("pause");
	return 0;
}

4.my_strcat:把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。

 要注意的是我们在进行strcat操作时,必须确保目标字符串足够长

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 str1[100] = "hello ";
	char* str2 = "world";
	char* ret = my_strcat(str1, str2);
	printf("%s\n", ret);
	system("pause");
	return 0;
}

5.strcpy:把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*。

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

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

猜你喜欢

转载自blog.csdn.net/Shile975/article/details/88540809
今日推荐