#c #pointers
#c #указатели
Вопрос:
Так что я знаю, что это действительно просто (или, по крайней мере, так кажется), я просто недостаточно знаком с C, чтобы увидеть это.
Вопрос: Возвращает указатель на первый символ первого вхождения substring в данной строке или NULL, если substring не является подстрокой string . Примечание: Пустая подстрока («») соответствует любой строке в начале строки.
Стартовый код:
char *find_substr(char *string, char* substring) {
return 0;
}
Ограничения:
Это неклассифицированный (именно поэтому я здесь) обзор задания C в моем колледже, поэтому у него есть некоторые довольно странные ограничения:
- Вы не можете использовать индексацию массива
- Вы не можете использовать целые числа
- Вы не можете #включить <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
имя информативным.