模拟实现strchr,strnchr,strstr,strrstr函数

strchr

查找字符串s中首次出现字符c的位置,返回首次出现c的位置的指针,如果s中不存在c则返回NULL

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<assert.h>
char *Is_strchr(char *str, char a)
{
assert(str != NULL);
while (*str)
{
if (*str == a)
{
return str;
}
else
*str++;
}
return NULL;
}
int main()
{
char arr[20] = "abcdedef";
char b = 'c';
char *ret;
ret = Is_strchr(arr, b);
printf("%s\n",ret);
system("pause");
return 0;
}

模拟实现strchr,strrchr,strstr,strrstr函数_搜索

strrchr

strrchr() 函数查找字符在指定字符串中从后面开始的第一次出现的位置,如果成功,则返回从该位置到字符串结尾的所有字符,如果失败,则返回NULL

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<assert.h>
char *Is_strrchr(char *str, char a)
{
assert(str != NULL);
char *p = str;
while (*p)
{
*p++;
}
while (*p != *(str-1))
{
if (*p == a)
{
return p;
}
else
*p--;
}
return NULL;
}
int main()
{
char arr[20] = "abcdecdef";
char b = 'c';
char *ret;
ret = Is_strrchr(arr, b);
printf("%s\n",ret);
system("pause");
return 0;
}

 

模拟实现strchr,strrchr,strstr,strrstr函数_字符串_02

 

 

大家可以看出两者的区别。

 

strstr

strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 NULL。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char *My_strstr(char *dst,char *str)
{
assert(str != NULL);
assert(dst != NULL);

char *s = dst;
char *q = str;
char *p = s;
while (*p)
{
p = s;
q = str;
while ((*p != '\0') && (*q != '\0'))
{
if (*p++ == *q++)
{
;
}
else
{
s++;
break;
}
}
if (*q == '\0')
{
return s; }
}
return NULL;
}
int main()
{
char *s1 = "Hello world!";
char *s2 = "el";
char *ret =My_strstr(s1, s2);
if (ret == NULL)
{
printf("sorry,Do not find!\n");
}
printf("%s\n", ret);
system("pause");
return 0;
}

运行结果如下:

模拟实现strchr,strrchr,strstr,strrstr函数_搜索_03

 

strrstr

strrstr() 函数搜索一个字符串在另一个字符串中最后一次出现。和strstr相似,该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 NULL。

可以将第一次出现的地方找到,继续找,将地址改成下次出现的地址。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char *My_strrstr(char *str1, char *str2)
{
assert(str1&&str2);
char *last = NULL;
char *start = str1;
int j = 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;
}
int main()
{
char *s1 = "abcdeabcde";
char *s2 = "abc";
char *ret = My_strrstr(s1, s2);
if (ret == NULL)
{
printf("sorry,Do not find!\n");
}
printf("%s\n", ret);
system("pause");
return 0;
}

运行结果如下:

模拟实现strchr,strrchr,strstr,strrstr函数_搜索_04