【strstr函数的介绍和模拟实现——超详细版】

strstr函数的介绍和模拟实现

strstr函数的介绍

资源来源于cplusplus网站
【strstr函数的介绍和模拟实现——超详细版】_第1张图片

strstr函数声明:
char *strstr( const char *str1, const char *str2 );

它的作用其实就是:
在字符串str1中查找是否含有字符串str2,如果存在,返回str2在str1中第一次出现的地址;否则返回NULL

不难看出它是定位字符串的

strstr函数是在字符串str1中查找是否含有字符串str2,如果存在,返回str2在str1中第一次出现的地址;否则返回NULL。

1.1用法举例

#include
#include
 
//strstr函数的应用
int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
 
	printf("%s\n", strstr(arr1, arr2));
 
	return 0;
}

1.2结果展示

【strstr函数的介绍和模拟实现——超详细版】_第2张图片

2.strstr函数的模拟实现

2.1模拟分析

对strstr函数有了一定了解后,我们开始对strstr函数的模拟—my_strstr函数。
如下图所示,假设有两个字符串,指针str1, str2分别指向字符串首字母。
要在str1中查找str2并打印出来,先判断str1和str2指向的字符是否相等,此时有两种情况:第一种情况指向的字符不相等,str1要指向下一个字符,再判断,如此循环往复,当str1指向的是 ‘\0’ 时,可以判断出str1中不存在str2,此时返回NULL;
第二种情况下指向的字符相等,那么不仅str1要向后读取字符,str2也要向后读取字符,再判断是否相等。
在向后读取字符的过程中,仍有两种情况:1.str1和str2指向的字符一直相等,直到str2指向’\0’,这时可以知道str1中存在str2字符串,返回的是str1中的str2字串的第一个字符地址;
2.str1和str2指向的字符不全相等,例如下图中,*(str1+1) == str2,(str1+2) == (str2+1),(str1+3) != *(str2+2),此时指针str2就要返回到字符串str2首字符的地址,而指针str1需要返回到第一次和str2指向的字符相等的后一个位置,即字符串str1中第二个 ‘b’ 的地址。然后又回到一开始的判断。

(注:字符串名字也是字符串首字符地址。)

【strstr函数的介绍和模拟实现——超详细版】_第3张图片

使用strstr时,最终返回str1中第三个字符的地址,打印的是该地址后的字符串

2.2代码实现

const char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);

	const char* s1 = str1;
	const char* cp = str1;
	const char* s2 = str2;
	//如果子字符串是空的直接返回str1的地址
	if (*str2 == '\0')
		return str1;

	while (*cp)
	{
		s1 = cp;
		s2 = str2;

		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
			if (*s2 == '\0')
				return cp;

			cp++;

	}
	return NULL;

}
int main()
{
    char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
	const char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
	{
		printf("%s\n",ret);
	}
	else
		printf("找不到\n");


	return 0;
}

你可能感兴趣的:(C语言,#,函数,#指针,c语言,库函数模拟实现,算法)