[英]Find the rightmost occurrence of a string t, in a string s
更正的代码:
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;
}
for (p = k; s[p] != '\0'; p++) {
while (s[p] == t[p] && t[p] != '\0') { p++; }
此时,您正在比较从位置p
开始的字符串s
和从位置0开始的字符串t
。因此,它不应该是t[p]
,而是t[p - k]
。
if (s[p] != t[p] || t[p] != '\0') { i = -1; }
您根本不需要它-如果当前部分不匹配,则将i
保留在最后一个匹配项中。 (如果到目前为止没有匹配项,则总为-1)
我认为这应该工作:
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;
}
p
上的循环同时索引s[p]
和t[p]
。 这是不正确的,因为它们都是不同的索引。 if (s[p] != t[p] ...) i = -1;
无效,因为您立即将其设置为k
。 您不是第一个想要这种功能的人。
请参阅: strstr是否有反向fn()? 对于一些示例实现。
您的代码中有几个错误。 这是我找到的:
这里有关于子字符串搜索算法的大量参考: http : //www-igm.univ-mlv.fr/~lecroq/string/index.html
使用它们中的任何一个,您都可以简单地切换操作,从指向字符串最后一个字节的指针开始,然后取消索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.