Как сделать лучше сравнение строк?
Важливо: Дуже погано знаю російську, тому всі тексти перекладені з допомогою гугл-перекладача!
Добрый день, уважаемые господа. Суть задачи: "Надо создать функцию, сравнивающую строку с образцом и возвращающую адрес вхождения подстроки в строку". Я думаю, что написанная мной функция ОЧЕНЬ криво сделана (хоть и работает). Покажите как должно быть сделано и объясните почему. (Коментарии писал с очень плохим знанием английского)
const char *find_a_substring(const char *string, const char *substring)
/*This function compare 'string' with 'substring' and return address of 'entry point' of substring'.*/
{
while( *string ){
/*while string is being*/
for(int i = 0; *(substring+i); i++){
/*while substring doesn't finish*/
if( !*(string+i) ){
/*if string is done - return nothing*/
return NULL;
}
if( *(substring+i) != *(string+i) ){
/*if char from string and char from substring doesn't equal - repeat for tail of string without one element*/
string++;
i = 0;
continue;
}
}
/*if cicle 'for' is done but we hasn't been returned - 'string' contains our addres of substring entering*/
return string;
}
/*func never get there*/
puts("NeverThere!");
return NULL;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Ну, я бы делал так — хотя решение и неоптимально, но для учебного примера (я так понимаю, речь именно о нем) сойдет. Смысл — проверяем, начиная с каждого очередного символа строки, совпадение с подстрокой.
const char *find_a_substring(const char *string, const char *substring)
{
// Для пустых или отсутствующих (NULL) строк и подстрок возвращаем NULL
if (string == NULL || substring == NULL
|| *substring == 0 || *string == 0) return NULL;
for(;*string;++string) // Цикл по всем позициям в строке
{
const char *s = string, *t = substring; // Временные переменные, чтоб не
// терять исходные значения указателей
for(; *s && *t && *t == *s; ++s, ++t); // Цикл сравнения строки с подстрокой.
// Завершается, если заканчивается строка, подстрока или если находится
// несовпадающий символ
// Если выход из цикла случился по завершению подстроки - значит, она найдена.
if (*t == 0) return string;
}
return NULL; // Если попали сюда — подстрока не найдена
}