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

时间:2010-07-04 04:57:47

标签: c algorithm string

更正后的代码:

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;
}

6 个答案:

答案 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)

您的代码中存在多个错误。以下是我发现的那些:

  1. 你正在使用p,这是进入s的方式,作为t的开头的索引。你想改为引用t [p-k]。
  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 [p-k]!='\ 0')。
  5. 将i设置为-1将清除之前发现的任何内容。这是错误的 - 无效匹配不应使先前的有效匹配无效。如果你摆脱了额外的内部for循环,这可以变成一个continue语句。
  6. i = k需要一个else子句,因此它不会消除i = -1,或者i = -1需要中断/继续当前迭代。

答案 5 :(得分:0)

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

使用它们中的任何一个,你可以简单地切换到指向字符串最后一个字节的指针并取消索引。