繁体   English   中英

在字符串s中找到最右边出现的字符串t

[英]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()? 对于一些示例实现。

您的代码中有几个错误。 这是我找到的:

  1. 您正在使用p(它是s的方式)作为t开头的索引。 您想改为引用t [pk]。
  2. 在内部while循环中使用p会干扰for循环中p的操作。 实际上,您不需要在p上使用for循环,因为外部for循环负责遍历s。
  3. 当您到达s的末尾时,while循环没有任何保护,因此,很容易从s的末尾开始运行(在s的末尾具有部分匹配的t)。
  4. (s [p]!= t [pk] || t [pk]!='\\ 0')将在t [pk] =='\\ 0'时为真,这是错误的–如果s继续下去就可以在t停止之后。 您可以简化为(t [pk]!='\\ 0')。
  5. 将i设置为-1将清除您之前所做的任何查找。 这是错误的-无效的匹配不应使先前的有效匹配无效。 如果您摆脱了额外的内部for循环,则可以将其变成continue语句。
  6. i = k需要else子句,因此它不会清除i = -1,或者i = -1需要中断/继续执行当前迭代。

这里有关于子字符串搜索算法的大量参考: http : //www-igm.univ-mlv.fr/~lecroq/string/index.html

使用它们中的任何一个,您都可以简单地切换操作,从指向字符串最后一个字节的指针开始,然后取消索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM