模拟实现strstr

函数原型是char*str(char *str1,char *str2);作用是找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符),如果找到,从str1中的str2位置起,返回str1中str2起始位置的指针,如果没有,返回NULL.

举个例子:str1[32]="abcdedefg",str2[20]=def,通过函数str(str1,str2)可以得到“defg”.

那我们怎么才能模拟实现strstr函数呢?

首先的思路是创建两个指针char *p,char *q,而且返回函数定义为char *my_srtsrt(const char *dest,char *scr);分别让p,q指向

dest(str1传参)和scr(str2传参),通过指针来访问字符串。根据上面的例子,p指向a,q指向d,若是两个相等,则两个指针都向后移动一位,再解引用进行判断;若是两个不相等,那么向p后移动一位,q不动,两个再次进行比较。重复这个过程,直到两个字符串其中一个或者是两个都遇到‘\0‘(如果是q遇到‘\0’,则找到了;如果是p遇到‘\0’,则返回NULL)。

但是,如果定义char str1[32] = "abbbcdefg";char str2[10] = "bbcd"呢,结果是不是“bbcdefg”呢?

我们来看一下:当p指向a,q指向b,这时两个不相等,p继续向下执行;p指向b,这时*p=*q,pq指针同时移动;*p='b',*q='b',两个还相等,pq指针同时移动;*p='b',*q='c',两个不相等,p向后移动,而q不动(下次判断*q="bbcd"重新开始);然后*p='b',*q='b',两个相等,pq向后移动;*p='c',*q='b',两个不相等,p继续向下执行,而q不动;如此循环,我们发现没有找到字符串“bbcd”,结果返回NULL。

中间跳过了一个字符没有比较,所以,上面第一个思路是不可行的。

现在对上面的思路稍微修改一下:我们需要再定义一个指针变量char *np指向p,当*p!=*q时,让p指针返回到起始位置的下一个位置,然后再进行比较。下面我们来看一下具体程序:

#include<stdio.h>
#include<windows.h>
#include<assert.h>

char *my_strstr( char* dest,  char * src)
{
	assert(dest);
	assert(src);

	char *p = NULL;
	char *np = NULL;
	char *q =NULL;
		p = dest;

		//当*p!='\0'时,循环一直成立
		while (*p)
		{
			np = p; //np指向p;
			q = src; //q指向src;
			for (; (*np && *q) && (*np == *q); np++, q++)
			{
				;
			}

				if (*q == '\0')//说明已经找到字符串“bbcd”
				{
					return p;
				}
				if (*np == '\0')
				{
					break;
				}
			p++;//可以得到原始位置的下一个位置;
		}
		return NULL;//not find
}

int main()
{
	char str1[32] = "abbbcdefg";
	char str2[10] = "bbcd";
	printf("%s\n", my_strstr(str1, str2));
	system("pause");
	return 0;
}

运行后的结果就是“bbcdefg”.






猜你喜欢

转载自blog.csdn.net/snowyuuu/article/details/80355595
今日推荐