K&R练习4-1
编写一个函数,它返回字符串t在s中最右边出现的位置。如果s中不包含t,则返回-1.
int strrindex(char s[], char t[])
{
int i, j , k;
int pos = -1;
//明确内外循环:遍历到s数组结尾时若仍无法找到与t匹配的字符串
//那么就表明s中不含t,也说明外层循环的边界条件应该是遍历到s字符串的结尾
for (i = 0; s[i] != '\0'; i++)
{
//在找到字符串t在s中的匹配后只记录其位置,然后继续搜索
//这里通过变量i来记录,所以之后应该用其他的变量来指出s字符串参与比较的位置
for (j=i,k=0; t[k] != '\0' && s[j] == t[k]; j++ , k++)
{
;
}
if (k > 0 && t[k] == '\0')
{
pos = i;//如果t在s中不是最后一次出现,那么pos的值还会被更新
//例如:t:abc s:abcdegabcdd
}
}
}
//another method
int strrindeximprove(char s[], char t[])
{
int i, j, k;
for (i = strlen(s)-strlen(t); i >= 0; i--)//改变了开始寻找字符串t的位置
//因为本题要找到字符串t在s中最右边出现的位置,那么不妨从字符串尾部开始查找
//原来是从字符串首开始,而现在是从字符串s的尾部再向其首部推进字符串t长度个字符的位置开始查找字符串t
//因为最极端的情况是字符串t位于字符串s的最右端,然后逐渐从右往左(字符串串首方向)退一个位置再次进行比较
{
for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++)
{
;
}
if (k > 0 && t[k] == '\0')
{
return i;//一旦找到就立刻返回字符串t在s中的位置,因为是从字符串尾部开始寻找
}
}
}