题目:
实现字符串函数strstr的功能,在一个字符串中查找另一个字符串,若查找到则返回子串第一次出现的地址,若查找不到返回NULL。
解题思路:
在一个字符串(假设为str1)中查找另一个字符串(假设为str2)。思路是遍历整个字符串str1,如果出现与字符串str2首字母相同的字母,那么我从这个位置(注意每次对照时要保存地址,后续比对完全相同时要将地址返回)开始对照两个字符串的字母,若str1中有一段字母与str2完全相同,就返回保存的地址。当遍历完整个字符串后,仍然没有返回一个地址,证明str2不是str1的字串,返回NULL。
程序代码:
#include <stdio.h>
char * my_strstr(char *str_1, char *str_2)
{
char *s = NULL;//用于记录第一次查找到的位置
char *str2 = str_2;
while(*str_1)//遍历字符串str1
{
s = str_1;//记录可能返回的地址
str_2 = str2;//重置指针指向字符串str_2的首地址
if(*str_1 == *str_2)//第一个字符匹配时判断剩余字符是否匹配
{
while(*++str_2)
{
++str_1;
if(*str_1 != *str_2)
{
break;
}
}
if(*str_2 == '\0')
return s;
}
str_1 = s+1;
}
return NULL;
}
int main(int argc, char *argv[])
{
int i;
char str_1[50];
char str_2[50];
puts("请输入一个字符串str_1:");
gets(str_1);
puts("请输入要查找的字符串str_2:");
gets(str_2);
char * ret = my_strstr(str_1,str_2);//接收返回值
if(ret == NULL)//未查找到
{
puts("字符串str_2不是字符串str_1的子串");
}
else
printf("字符串str_2是字符串str_1的子串,首次出现的地址为%p\n",ret);
printf("下面为字符串str_1各个字符地址表,方便对照\n");
for(i = 0; str_1[i] != '\0'; i++)
{
printf("%c-----%p\n",str_1[i],str_1+i);
}
}
运行结果:
请输入一个字符串str_1:
hello world
请输入要查找的字符串str_2:
orl
字符串str_2是字符串str_1的子串,首次出现的地址为0x7ffe42b60e47
下面为字符串str_1各个字符地址表,方便对照
h-----0x7ffe42b60e40
e-----0x7ffe42b60e41
l-----0x7ffe42b60e42
l-----0x7ffe42b60e43
o-----0x7ffe42b60e44
-----0x7ffe42b60e45
w-----0x7ffe42b60e46
o-----0x7ffe42b60e47
r-----0x7ffe42b60e48
l-----0x7ffe42b60e49
d-----0x7ffe42b60e4a
请输入一个字符串str_1:
hello world
请输入要查找的字符串str_2:
nihao
字符串str_2不是字符串str_1的子串
下面为字符串str_1各个字符地址表,方便对照
h-----0x7ffe09a620b0
e-----0x7ffe09a620b1
l-----0x7ffe09a620b2
l-----0x7ffe09a620b3
o-----0x7ffe09a620b4
-----0x7ffe09a620b5
w-----0x7ffe09a620b6
o-----0x7ffe09a620b7
r-----0x7ffe09a620b8
l-----0x7ffe09a620b9
d-----0x7ffe09a620ba
标签:一个,char,地址,查找,-----,str,字符串
From: https://blog.csdn.net/a921876874/article/details/143244358