查找子串(指针数组 多级指针 函数指针)

本题要求实现一个字符串查找的简单函数。
函数接口定义:
char *search( char *s, char *t );

img

函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。
输入样例1:
The C Programming Language
ram
输出样例1:
10
输入样例2:
The C Programming Language
bored
输出样例2:
-1
代码

img


可以帮我解释一下框住的那部分的意思吗?我不太理解 谢谢!

当前字符不相等时,从上一次字符相等的下一个字符开始继续开始匹配,并且将子字符串的索引j重置为0(重新开始匹配)
举例:

The C Programming Language
ram

主字符串、子字符串通过指针往后移动,(字符r)之前的字符都是不相等的执行的是else分支,相等于主字符串的索引在往后移动。
直到i=7的时候,主字符串的r和子字符串的r相等,执行if语句,此时i=8,j=1。

s[8]='o',t[1]='a'

此时,不相等,执行else分支,i被置为8-1+1=8;j被置为0
重复上述操作。

j 是已经判断的 t 中字符的个数,else部分是如果s[i]不等于t[j]说明两个字符不相等,那么 i 就从i-j+1的位置重新开始判断,j 重置为0来重新遍历t
举个例子来说:
假如s="abcdecdx"; t = "cdx";
i和j初始为0,开始执行while循环:
i=0,j=0 : s[0]=‘a'和t[0]='c'都不等于'\0 ,执行循环体 s[0] == t[0]不成立,执行else语句,i = i-j+1 = 0-0+1= 1; j = 0;
i=1,j=0 : s[1]='b'和t[0]='c'都不等于'\0 ,执行循环体 s[1] == t[0]不成立,执行else语句,i = i-j+1 = 1-0+1= 2; j = 0;
i=2,j=0 : s[2]='c'和t[0]='c'都不等于'\0 ,执行循环体 s[2] == t[0]成立,执行if语句,i++,j++ (i变为3,j变为1)
i=3,j=1 : s[3]='d'和t[1]='d'都不等于'\0 ,执行循环体 s[3] == t[1]成立,执行if语句,i++,j++ (i变为4,j变为2)
i=4,j=2 : s[4]='e'和t[2]='x'都不等于'\0 ,执行循环体 s[4] == t[2]不成立,执行else语句,i = i-j+1 = 4-2+1= 3; j = 0; 也就是 s重新从s[3]开始判断,t从t[0]再开始判断
i=3,j=0 : s[3]='d'和t[0]='a'都不等于'\0 ,执行循环体 s[3] == t[0]不成立,执行else语句,i = i-j+1 = 3-0+1= 4; j = 0;
i=4,j=0 : s[4]='e'和t[0]='a'都不等于'\0 ,执行循环体 s[4] == t[0]不成立,执行else语句,i = i-j+1 = 4-0+1= 5; j = 0;
i=5,j=0 : s[5]='c'和t[0]='c'都不等于'\0 ,执行循环体 s[5] == t[0]成立,执行if语句,i++,j++ (i变为6,j变为1)
i=6,j=1 : s[6]='d'和t[1]='d'都不等于'\0 ,执行循环体 s[5] == t[0]成立,执行if语句,i++,j++ (i变为7,j变为2)
i=7,j=2 : s[7]='x'和t[2]='x'都不等于'\0 ,执行循环体 s[5] == t[0]成立,执行if语句,i++,j++ (i变为8,j变为3)
i=6,j=3 : t[3]='\0'都不等于'\0 ,while条件不成立,结束循环,此时 j = 3,正好是 t 的长度,所以 t 包含再 s 中(也就是if (j == strlen(t)) 这段代码表达的意思。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632