Wzorzec i łańcuch

0

Napisz funkcję match(char* wzorzec, char* łańcuch), która ustala zgodność wzorca z łańcuchem. Znak '?' we wzorcu oznacza zgodność z dowolnym innym znakiem. Znak ''(gwiazdka, nie wiem czemu nie widać) oznacza zgodność z dowolnym, również pustym, ciągiem znaków w łańcuchu. Znak różny od '?' i '' oznacza zgodność tylko z samym sobą.

#include <stdio.h>
#include <string.h>

int match(char* wzorzec, char* lancuch)
    {
        int poprawnosc = 1;
        int i, j;

        for(i = 0, j = 0; i < strlen(lancuch); i++, j++)
        {


            if(wzorzec[j] == '?')
            {
            continue;
            }

            if(wzorzec[j] == '*')
            {

                while(lancuch[i] != wzorzec[j+1])
                {
                    i++;
                }

            j++;
            }


                if(lancuch[i] != wzorzec[j] || strlen(lancuch) < strlen(wzorzec))
                {
                    poprawnosc = 0;
                    break;
                }
        }

        return poprawnosc;
    }



int main()
{
    char wzorzec[1000];
    char lancuch[1000];
    int poprawnosc;

    printf("Podaj wzorzec\n");
    scanf("%s", &wzorzec);
    printf("Podaj lancuch\n");
    scanf("%s", &lancuch);

    poprawnosc = match(wzorzec, lancuch);

    if(poprawnosc == 1)
    {
        printf("Lancuch jest zgodny z wzorcem.");
    }else
    {
        printf("Lancuch nie jest zgodny z wzorcem.");
    }




    return 0;
}

Opiszę na przykładzie mój problem. Weźmy wzorzec *.doc. Program będzie dobrze weryfikował czy łańcuch jest zgodny ze wzorcem dopóki nie będę używał '.' w łańcuchu, tj. dasdsa.doc stwierdzi, że łańcuch jest zgodny ze wzorcem, natomiast sdasd.dsadsa.doc program stwierdzi, że łańcuch nie jest zgodny ze wzorcem. I z tym potrzebuje pomocy. Myślę bardzo długo jakby napisać program by działał właściwie, lecz na nic nie mogę wpaść. :/

0

Twój algorytm nie działa dobrze, pokazuje zgodny także w takim przypadku:
wzorzec: *.doc;
łańcuch: cokolwiek.
Powinieneś przepisać to tak, by oddzielnie rozpatrzyć przypadek jeżeli we wzorcu występuje gwiazdka i szukać wystąpień ciągu w łańcuchu który pojawia się między gwiazdkami we wzorcu.
U ciebie szuka tylko wystąpienia tego samego znaku po gwiazdce:

 while(lancuch[i] != wzorzec[j+1])
0

"Udoskonaliłem" trochę program, lecz program wywala na tej linii kodu:

while(j <= strlen(wzorzec) || wzorzec[j+1] != '?' || wzorzec[j+1] != '*')

i nie mogę sprawdzić czy program będzie działał dobrze. Jeśli zamienię znaki alternatywy na znaki koniunkcji program odpali się do końca, źle, ale odpali. W czym jest problem?

Wrzucę cały kod, może jest potrzebny.


#include <stdio.h>
#include <string.h>

int match(char* wzorzec, char* lancuch)
    {
        int poprawnosc = 1;
        int i, j, k, licznik;

        for(i = 0, j = 0; i < strlen(lancuch); i++, j++)
        {


            if(wzorzec[j] == '?')
            {
            continue;
            }

            if(wzorzec[j] == '*')
            {
                licznik = 0;
                poprawnosc = 0;

                while(lancuch[i] != wzorzec[j+1] && i < strlen(lancuch))
                {
                    i++;
                    if(lancuch[i] == wzorzec[j+1])
                    {
                        poprawnosc = 1;
                    }

                }
                while(j <= strlen(wzorzec) || wzorzec[j+1] != '?' || wzorzec[j+1] != '*')
                {
                    j++;
                    licznik++;
                }
                j = j - licznik;

                if(lancuch[i+licznik] == strlen(wzorzec) || lancuch[i+licznik] == '?' || lancuch[i+licznik] == '*')
                {
                    j++;
                    for(k = 0; k < licznik; k++)
                    {
                        if(lancuch[i] != wzorzec[j])
                        {
                            poprawnosc = 0;
                            break;;
                        }
                    }
                }



            }


                if(lancuch[i] != wzorzec[j] || strlen(lancuch) < strlen(wzorzec))
                {
                    poprawnosc = 0;
                    break;
                }
        }

        return poprawnosc;
    }



int main()
{
    char wzorzec[1000];
    char lancuch[1000];
    int poprawnosc;

    printf("Podaj wzorzec\n");
    scanf("%s", &wzorzec);
    printf("Podaj lancuch\n");
    scanf("%s", &lancuch);

    poprawnosc = match(wzorzec, lancuch);

    if(poprawnosc == 1)
    {
        printf("Lancuch jest zgodny z wzorcem.");
    }else
    {
        printf("Lancuch nie jest zgodny z wzorcem.");
    }




    return 0;
}

0

uzywales debuggera?

0

Tak, stąd właśnie wiem, że wywala na tej linii.

0

to przy debugowaniu (gdy sie ma wywalic albo jak sie wywali) zobacz nastepujace rzeczy

  • wartosc j
  • jak duza tablica jest wzorzec

bo zapewne przez to +1 oraz znak <= wychodzisz po za zakres tablicy dlatego Ci sie wywala

0

No chyba w tym jest problem, bo wyświetliło, że j=1211, a rozmiar tablicy jest 1000. Tylko zastanawiam się, czemu 'j' jest takie duże. Wpisałem wzorzec (gwiazdka).doc, więc strlen(wzorzec) = 5. Na początku j=0 i zwiększa się dopóki wartośc w tablicy dla j+1 będzie '?' lub '*' lub jeśli j będzie większe od 5. Więc czemu j jest takie duże?

0

Już wiem, tam powinna być koniunkcja zamiast alternatywy. Przepraszam i dziękuję za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1