Найти самое правое вхождение строки t в строку s - PullRequest
2 голосов
/ 04 июля 2010

Исправленный код:

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 ]

1 голос
/ 04 июля 2010
  for (p = k; s[p] != '\0'; p++) {
    while (s[p] == t[p] && t[p] != '\0') { p++; }

На этом этапе вы сравниваете строку s, начинающуюся с позиции p, со строкой t, начинающейся с позиции 0. Таким образом, она должна быть не t[p], а вместо t[p - k].

    if (s[p] != t[p] || t[p] != '\0') { i = -1; }

Вам это вообще не нужно - если текущий раздел не совпадает, вы просто оставляете i при последнем совпадении. (который в любом случае будет равен -1, если совпадений пока не было)

0 голосов
/ 04 июля 2010

Здесь есть отличная ссылка на алгоритмы поиска подстрок: http://www -igm.univ-mlv.fr / ~ lecroq / string / index.html

С любым из них вы можете просто переключать объекты, начиная с указателей на последний байт строки и отрицая индексы.

0 голосов
/ 04 июля 2010

В вашем коде есть несколько ошибок. Вот те, которые я нашел:

  1. Вы используете p, то есть путь к s, как указатель на начало t. Вместо этого вы хотите сослаться на t [p-k].
  2. Использование p во внутреннем цикле while мешает работе p в цикле for. На самом деле вам не нужен цикл for для p, поскольку внешний цикл for выполняет итерацию по s.
  3. Цикл while не имеет защиты для достижения конца s, поэтому довольно легко убежать от конца s (иметь частично совпадающий t в конце s).
  4. (s [p]! = T [p-k] || t [p-k]! = '\ 0') будет иметь значение true, когда t [p-k] == '\ 0', что неверно & ndash; все в порядке, если s продолжает идти после t остановок. Вы можете упростить это до (t [p-k]! = '\ 0').
  5. Установка i в -1 уничтожит все ваши предыдущие находки. Это неправильно & ndash; неверное совпадение не должно аннулировать предыдущее действительное совпадение. Если вы избавитесь от дополнительного внутреннего цикла for, это может просто превратиться в оператор continue.
  6. i = k нужно условие else, чтобы оно не уничтожало i = -1, или i = -1 нужно прерывать / продолжать из текущей итерации.
0 голосов
/ 04 июля 2010

Вы не первый человек, который хочет такую ​​функцию.

См .: Есть ли обратный fn () для strstr? для некоторых примеров реализации.

0 голосов
/ 04 июля 2010
  • Ваш цикл по p индексирует s[p] и t[p]. Это неверно, поскольку оба они имеют разные индексы.
  • Ваш if (s[p] != t[p] ...) i = -1; не имеет никакого эффекта, потому что вы сразу же установите его на k.
0 голосов
/ 04 июля 2010

Я думаю, что это должно работать:

 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...