Возвращает указатель начала подстроки в строке с ограничениями (C)

#c #pointers

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

Вопрос:

Так что я знаю, что это действительно просто (или, по крайней мере, так кажется), я просто недостаточно знаком с C, чтобы увидеть это.

Вопрос: Возвращает указатель на первый символ первого вхождения substring в данной строке или NULL, если substring не является подстрокой string . Примечание: Пустая подстрока («») соответствует любой строке в начале строки.

Стартовый код:

 char *find_substr(char *string, char* substring) {
   return 0;
}
 

Ограничения:
Это неклассифицированный (именно поэтому я здесь) обзор задания C в моем колледже, поэтому у него есть некоторые довольно странные ограничения:

  1. Вы не можете использовать индексацию массива
  2. Вы не можете использовать целые числа
  3. Вы не можете #включить <string.h> или что-либо еще

Что у меня есть: в принципе, ничего, я могу придумать 100 различных способов сделать это без ограничений, но я не привык использовать указатели в коде, и это действительно ставит меня в тупик.

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

1. У вас есть доступ к экземпляру книги «Язык программирования C»? Если вы это сделаете, посмотрите раздел 5.6.

2. Извините, не раздел 5.6, я имел в виду раздел 5.5.

Ответ №1:

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

 #include <stddef.h>
#include <stdio.h>
#include <stdbool.h>

bool starts_with(char *str, char *prefix) {
    while (*str == *prefix) {
        if (*prefix == '') {
            // an empty string is a prefix of any string
            return true;
        } else if (*str == '') {
            // no non-empty strings are prefixes of the empty string
            return false;
        }
        str  ;
        prefix  ;
    }
    // one string is not a prefix of the other if their first characters are not the same
    return false;
}

char *find_substr(char *str, char *sub) {
    for (char *p = str; *p; p  ) {
        if (starts_with(p, sub)) {
            return p;
        }
    }
    return NULL;
}
 

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

1. Для таких задач я нахожу char *haystack, char *needle имя информативным.