串中找串(strstr的模擬實現)

串中找串

這個串可不是羊肉串奧,喜歡擼串的盆有別失望啊。來看看我們的串吧。

在這裏插入圖片描述
所謂的串中找串是指在一個字符串中查找另外一個字符串(所謂的子串)。

想啥呢?當然不是羊肉串了。

需求:

1.我們的需求是當找到我們所找的子串的時候,返回父串中與子串相等元素在父串中的位置下標

2.若沒有找到對應的字符串則返回0

No1:創建兩個指針的方式

#include<iostream>

using namespace std;

int StrStr(char*s1, char * s2){
	while (*s1){//遍歷字符串s1
		if (*s1 == *s2){ //判斷兩個字符串相應的字符是否相等
			char *str=s1;
			char *ret = s2;
			while (*str&&*ret){
                //當兩個字符串中有一個遍歷結束的時候,循環結束
				if (*str != *ret)
                    //當遇到不同的字符時跳出循環
					break;
				str++;
				ret++;
			}
			if (*ret == '\0')
				return (str-s1);
		}
		s1++;
	}
	return 0;
}

int main(){
	char *s="hello  world!";
	cout<<StrStr(s, "world!")<<endl;
	return 0;
}

該程序中的兩個指針起到了的作用

1.遍歷兩個字符串

2.確定字符串的對應字符的值是否相等

No2:四指針遍歷法

#include<iostream>

using namespace std;

int StrStr( char*s1,  char * s2){
	char *ret = s1;
	char *jun = s1;
	char *str = s2;
	char *ptr = s2;
	while (*ret){
		if (*ret == *str){
			while (*ret&&*str){
				if (*ret != *str)
					break;
				ret++;
				str++;
			}
			if (*str == '\0')
				return (jun - s1);
			str = ptr;
		}
		if (jun != ret){
			ret = jun;
		}
		ret++;
		jun++;
	}
	return 0;
}

int main(){
	char *s = "hell hello  world!";
	cout << s << endl;
	cout << StrStr(s, "hello") << endl;
	return 0;
}

該程序中的四個指針的作用

1.ret和str指針負責遍歷兩個字符串還有 確定字符串的對應字符是否相等

2.指針jun作用是 負責在遍歷的過程中儲存父串遍歷指針的地址信息 ,在匹配成功的時候jun記錄的是開始匹配的位置(與字符串首地址相減得到首個匹配元素的位置下標),在匹配失敗時將父串指針指向與子串開始配匹的位置繼續向後遍歷(指針ret和指針jun指向同一片空間)
3.指針ptr的使用是在與父串匹配失敗的時候將子串指針指向子串的首地址與父串重新進行匹配。

該程序設計過程中必須考慮的問題

1.父串中有幾個字符與子串的幾個字符匹配(相同),但是並不完全匹配的情況處理

//父串
char *s="hel hell0 world!"//子串
char *s1="hello"

當父串指針遍歷的過程中進行了挪動但是沒有完全與子串匹配成功時,父串遍歷指針就需要指回原來和子串開始比較的位置(子串指針也因該回到子串的首地址,準備下一次的匹配)

2.返回值的計算

返回的是父串指針開始匹配時的地址與首地址的差值

【總結】

1.首先要進行父串的遍歷,在遍歷的過程中判斷父串元素和子串的首元素是否相等,若相等則接着比較後面的字符,若不相等則父串指針往後移動一位。

2.在比較父串和子串的元素的過程中,若遇到只匹配成功一半的情況,需要把子串遍歷指針指向子串首地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章