更正后的代码:
int strrindex(char *s, char *t) {
int i, j, k, p;
i = -1;
for (k = 0; s[k] != '\0'; k++) {
if (strlen(s) < strlen(t)) break;
if (s[k] == t[0]) {
for (p = k; s[p] != '\0'; p++) {
j = p;
while (s[j] != '\0' && s[j] == t[j-k] && t[j-k] != '\0') { j++; }
if (t[j-k] != '\0') { break; }
i = k;
}
}
}
printf("%d\n", i);
return 0;
}
答案 0 :(得分:1)
for (p = k; s[p] != '\0'; p++) {
while (s[p] == t[p] && t[p] != '\0') { p++; }
此时,您正在比较从位置s
开始的字符串p
和从位置0开始的字符串t
。所以它不应该是t[p]
,而是t[p - k]
。
if (s[p] != t[p] || t[p] != '\0') { i = -1; }
你根本不需要这个 - 如果当前部分不匹配,你只需在最后一场比赛中留下i
。 (如果到目前为止没有匹配,那么无论如何都是-1)
答案 1 :(得分:0)
我认为这应该有效:
int strrindex(char *s, char *t) {
int i = -1;
int j = 0;
int k = 0;
for (; s[k]; k++) {
if(!t[j]) {
i = k - j;
j = 0;
}
if (s[k] != t[j])
j = 0;
else
j++;
}
if(!t[j + 1])
i = k - j - 1;
return i;
}
答案 2 :(得分:0)
p
的循环正在为s[p]
和t[p]
编制索引。这是不正确的,因为它们都是不同的指数。if (s[p] != t[p] ...) i = -1;
无效,因为您会立即将其设为k
。答案 3 :(得分:0)
你不是第一个想要这样功能的人。
有关示例实现,请参阅: Is there a reverse fn() for strstr? 。
答案 4 :(得分:0)
您的代码中存在多个错误。以下是我发现的那些:
答案 5 :(得分:0)
这里有关于子串搜索算法的很好的参考:http://www-igm.univ-mlv.fr/~lecroq/string/index.html
使用它们中的任何一个,你可以简单地切换到指向字符串最后一个字节的指针并取消索引。