2016-11-11 2 views
3

Так что моя проблема в том, что мне нужно найти числовое положение подстроки в большей строке, используя для циклов. Я не могу использовать строковую функцию, такую ​​как strstr, и я пробовал большинство итераций вложенных циклов.Поиск позиции первого символа подстроки в большей строке

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

Если все соответствует, оно вернет позицию первого символа подстроки, и если ничего не будет найдено, то оно вернет -1.

Любая помощь очень ценится. Благодаря!

+0

Можете ли вы привести пример подстроки и более крупной строки? и какую позицию вы ожидаете? – RoadRunner

+0

Что вы имеете в виду, когда говорите _ «Я не могу использовать строковую функцию, такую ​​как strstr» _? –

ответ

1

Как правильно описать, это можно сделать с помощью 2-х вложенных циклов:

#include <stdlib.h> // for size_t 

int indexof(const char *str, const char *substr) { 
    for (size_t i = 0;; i++) { 
     /* for every position in the string */ 
     for (size_t j = 0;; j++) { 
      /* check of all characters fro substr match at this offset */ 
      if (substr[j] == '\0') { 
       /* if we reach the end of substr, we have a match at offset i */ 
       return i; 
      } 
      if (str[i + j] != substr[j]) { 
       /* if there is a mismatch, stop checking and skip to the next offset */ 
       break; 
      } 
     } 
     if (str[i] == '\0') { 
      /* no match found: return -1 */ 
      return -1; 
     } 
    } 
} 

Примечания:

  • Функция определяется как возвращающая int, потому что она возвращает -1 для соответствия. Однако смещение матча может не соответствовать диапазону int. Возврат подписанного типа, такого как ssize_t, определенный в POSIX, не будет полностью устранять эту проблему в 32-разрядных системах, если к ним можно получить доступ более 2 ГБ данных.

  • Функция может быть выполнена быстрее, если явно проверить первый символ подстроки.

  • Для длинных строк и подстроек более сложные алгоритмы, такие как Boyer Moore's и Knuth Morris Pratt's, могут работать значительно быстрее.

+0

Для того, что стоит, использование определенного алгоритма строкового поиска, такого как KMP, может помочь этой задаче быть более эффективной. – RoadRunner

+0

Я только что протестировал код, но забыл упомянуть, что он должен работать и для строк с пробелами. Можно ли изменить это, чтобы включить пробелы? Поэтому, если бы я искал «Кошка классная» для подстроки «cat», она вернет целое число 4, поскольку оно включает пробелы. –

+0

@Monty: что вы подразумеваете под * включая пробелы *? Поиск '' cat '' in '" Кошка классная "' найдет ее уже в смещении 4. – chqrlie