Re: маска

From
Oleg I. Khovayko ()
To
Anton Morozov
Date
2002-10-09T20:22:45Z
Area
RU.ALGORITHMS
From: "Oleg I. Khovayko" <olegh@ncbi.nlm.nih.gov>

> Есть маска, есть строка. В маске любые символы и "*" с "?" Нада проверить,
> попадает ли строка в маску.

Как-то сильно наворочено у тебя получилось. Я, честно говоря, сильно не вникал.
Вместо вникания в твой код написал я за пару часов такуя вот процедуру:

<<<
#include <stdio.h>


int fmask(const char *mask, const char *str) {
  for( ; ; str++) {
    switch(*mask++) {
      case '*' : if(fmask(mask, str))
                    return 1;
                 mask--;
      case '?' : if(*str == 0) return 0;
		 continue;
      case  0  : return *str == '\0';
      default  : if(mask[-1] == *str) continue;
                 return 0;
    } // switch
  } // for
} // fmask


void main() {
  char mask[100], str[100];

  for( ; ; ) {
    printf("\nEnter mask and str: ");
    scanf("%s%s", mask, str);
    printf("\nmask:[%s] str:[%s]; Result: %s\n", mask, str, 
    	fmask(mask, str)? "OK" : "BAD");
  }
}

>>>
Вроде как работает...
Извини, что C использую, но Паскаля у меня нет, а без тестирования, "вслепую" 
сразу правильно написать вряд ли бы получилось. Но я надеюсь, тебе не сложно будет 
"по мотивам" написать что-то свое на Паскале.

Как будешь перепирать, обрати внимание, что в метке "case '*'" нет continue/break.
Здесь управление передается на "case '?'"

PS: полную безглючность не гарантирую - но на паре десятков моих тестов вроде как
работает. Потестируй перед использованием...

-- 
#include <best/regards.hpp>
Oleg I. KHOVAYKO  
(301)435-5885 || WEB: http://olegh.spedia.net
--- ifmail v.2.15dev5
 * Origin: National Center for Biotechnology Information (2:5020/400)