首页 > 代码库 > 模拟实现strstr和strrstr
模拟实现strstr和strrstr
strstr函数用于判断str2是否是str1的子串,如果是,则返回str2在str1中首次出现位置的地址,如果不是则返回NULL.其模拟实现代码如下:
#include<iostream>
using namespace std;
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1&&str2);
const char* p = str1;
const char* q = str2;
const char*start = NULL;
while (*p)
{
start = p;
while (*p&&*q&&*p == *q)
{
p++;
q++;
}
if (*q == ‘\0‘)
{
return (char*)start;
}
p = start + 1;
q = str2;
}
return NULL;
}
测试代码:
//#include<string>
char str[] = "lazy";
char String[] = "The quick brown dog jumps overs the lazy fox.";
void main()
{
char* pdest;
int result;
printf("String to be searched: %s\n", String);
pdest = my_strstr(String, str);
result = pdest-String + 1;
if (pdest != NULL)
printf("%s is found at position %d. \n", str, result);
else
printf("%s is not found\n",str);
}
这个start非常关键,它保存了str2在str1中首次出现的位置。
下面我们再模拟实现一下strrstr,这个函数看起来跟strstr很像,但它又是什么功能呢?strrstr是在字符串中查找指定字符串最后一次出现的位置。其模拟实现如下:
#include<iostream>
using namespace std;
#include<assert.h>
char* my_strrstr(char* str1,char str2[])
{
assert(str1&&str2);
char* last = NULL;
char* start = str1;
int j = 0;
while (*str2 == 0)
{
return 0;
}
while (*str1&&*str2)
{
start = str1;
while (*str1&&str2[j]&&*str1 == str2[j])
{
str1++;
j++;
}
if (str2[j]== ‘\0‘)
{
last = start;
}
str1 = start + 1;
j = 0;
}
if (*str1 == ‘\0‘)
return last;
else
return NULL;
}
测试代码:
void main()
{
char* str1 = "abcdefcdefop";
char* str2 = "def";
printf("%s\n", my_strrstr(str1,str2));
}
注意在实现strrstr的时候这里也有个start,这里的start存的也是匹配成功后的字符串的位置,但是随着程序的执行,如果字符串的后面继续有匹配成功的字符串,那么后面的这个地址将取代start里面原来的地址,当程序结束后,start里面存的就是字符串中查找到的指定字符串最后一次出现的位置。
模拟实现strstr和strrstr