Как работает функция, помогите разобраться
Читаю книгу. В ней описана такая ф-ция: (Взято из книги "Программирование: введение в профессию. II: низкоуровневое программирование", автор Андрей Викторович Столяров. Функция сравнения строки с образцом ("*" в образце означает любое к-во символов в строке, "?" - любой символ в строке)
int match( const char *str, const char *pat)
{
int i;
for(;; str++, pat++){
switch(*pat){
case 0;
return *str == 0;
case '*':
for(i=0; ;i++){
if(match(str+i, pat+1))
return 1;
if(!str[i])
return 0;
}
case '?':
if(!*str)
return 0;
break;
default:
if(*str != *pat)
return 0;
}
}
}
Помогите понять, как именно данная ф-ция сравнивает звездочку. (Например str = "Karasik", pat = "*sik". Если я правильно прочитал и понял прочитаное, то функция должна вернутьint > 0 (то есть True), если так, то как ф-ция обрабатывает звездочку?, объясните пожалуйста).
P.S.: Мои рассуждения (str = "Karasik", pat = "*sik"): Вход -> match(str, pat) -> case '*' -> i=0 -> match(str+0, pat+1) -> default -> (*str == 'K') != (*pat == 's') -> return 0 -> (возвращаемся в for(i;;i++) цикл) -> (match(str+0, pat+1) вернул 0, а значит сработает if(!str[i]) и вернет 0 -> Конец. (это не очень похоже на int > 0)
Где я ошибся?
Ответы (1 шт):
Ну давайте посмотрим..
Karasik *sik
Тот самый ваш цикл. Сравнение (рекурсивной - той же функцией!)
Karasik sik
Не прошло? идем дальше, i = 1
arasik sik
Не получилось? Пробуем еще, i = 2
rasik sik
И так, пока не получим совпадение (в данном случае - когда i=4) или не исчерпаем строку...
Так понятнее?
Ваша главная ошибка - вы решили, что
if(!str[i]) return 0;
сразу, при i==0 вернет 0. Но при i==0 получается str[0]=='K', так что это - ненулевое значение; его отрицание (!) даст нулевое значение, и if не сработает - он сработает только на завершающем строку нулевом символе.