本题要求实现一个字符串查找的简单函数。
函数接口定义:
char *search( char *s, char *t );
函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。
输入样例1:
The C Programming Language
ram
输出样例1:
10
输入样例2:
The C Programming Language
bored
输出样例2:
-1
代码
当前字符不相等时,从上一次字符相等的下一个字符开始继续开始匹配,并且将子字符串的索引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)) 这段代码表达的意思。