Как выполнить итерацию по массиву, чтобы найти строку в стиле C

#c #c 11 #pointers

#c #c 11 #указатели

Вопрос:

Напишите функцию char* findx(const char* s, const char* x), которая находит первое вхождение строки x в стиле C в s. Не используйте никаких стандартных библиотечных функций. Не используйте подписку; вместо этого используйте оператор разыменования * .

Для моих текущих целей я использую ограничения приглашения довольно свободно. В настоящее время у меня есть очень грубый код для поиска вхождения строки, но у меня возникли проблемы с арифметикой указателей, чтобы иметь возможность выводить соответствующее слово. Из-за того, как я построил свой цикл for , в выводе отсутствует первая буква. Кроме того, я использую переменную вне моего цикла for для увеличения моего указателя, чего я хочу избежать. Есть идеи о том, как я могу это улучшить? Я знаю, что есть лучшие способы подойти к этому, но я хотел посмотреть, смогу ли я улучшить это без существенного изменения цикла for .

 const char* findx(const char* s, const char* x)
{
  int size = strlen(s);
  int size1 = strlen(x);
  int n = 1;

  for (const char* p = amp;s[0]; p < amp;s[size];   p) {
    if (*p == *x) {
      for (const char* j = amp;x[1]; j < amp;x[size1];   j) {
        if (*j == *(p n)) {
          cout << *j;
            n;
        }
    }
   }
  }
  return nullptr;
}
 

Комментарии:

1. «Не используйте подписку» , поэтому замените amp;s[size] на s size .

2. Пока вы ждете ответов, я предложу пару предложений, чтобы сделать код более читаемым. size и size1 сбивают с толку имена переменных. Было бы понятнее, если бы их имена отражали их назначение, например, что-то вроде sizeS и sizeX . Аналогично, имена p и j немного сбивают с толку; ‘j’ обычно используется для индексации, и снова имена не отражают их назначение. Наконец, amp;s[0] это просто ‘s’, и вы можете использовать арифметику указателей вместо индексации для других значений. Внесение некоторых изменений в эти строки может упростить анализ кода.

3. Эта ссылка для std::search обеспечивает возможную реализацию.

4. Я бы предположил, что целью наличия const char * возвращаемого типа является возврат указателя на строку, если она найдена. Вы только возвращаетесь nullptr .

5. Не могли бы вы добавить пример с текущим поведением и ожидаемым поведением?