Szukanie wzorca w tablicy dwuwymiarowej - problem

0

Witam mam problem ze znalezieniem wzorca w tablicy dwuwymiarowej, ponieważ program zawiesza się przy szukaniu wzorca i nie wiem jak za bardzo naprawić ten błąd. Jeśli ktoś wie to niech napisze, co i jak zmienić. Z góry dzięki

#include <cstdlib>
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <vector>

using namespace std;

int porownaj(string p, char** t, int lok1, int lok2, int max_wiersz)
{
    int m=p.length();
    int j=0;
    int war=0;
    int maxw;
    maxw=max_wiersz;
    while ( j<m && t[max_wiersz % (lok1+j)][lok2] == p[j] )
    {
        if (war==0 && j+lok1>maxw)
        {
            war++;
            lok2++;
            maxw+=maxw;
        }
        if (war==1 && j>maxw)
        {
            lok2++;
            maxw+=maxw;
        }

          j++;
    }
    if (j == m)
    {
          return 1;
    }
    else
    {
        return 0;
    }
}

void szukaj (string p, char** t, int dl_w, int il_w, int n)
{
     int m=p.length();
     int i=0;
     int ile=1;
     int miejsce=0;
     int dwiersz=0;
     dwiersz=dl_w;
     while (i <= (n-m) )
     {
                 if (porownaj(p,t,miejsce, ile, dl_w) == 1)
                 {
                      miejsce=((i+1) % dl_w);
                      cout << "Wzorzec na miejscu : " << miejsce << "i wierszu nr " <<ile << endl;
                 }

                 if (i>dwiersz)
                 {
                     ile++;
                     dwiersz+=dwiersz;

                 }
     i++;
     }
}

vector<int> MP(string &p)
{
     vector<int> Pi(p.length()+1);                //m¹drzejsza tablica

     Pi[0]=-1;
     int i=0;
     int j=-1;
     int n=p.length();
     while ( i <= n )
     {
           while ( j > -1 && p[i] != p[j] )
           {
                 j=Pi[j];
           }
           i++;
           j++;
           Pi[i] = j;
     }
     return Pi;              //PI
}

vector<int> KMP(string &p)                 //¿eby nie kopiowaæ, a tylko wy³uskaæ wartoœæ
{
     vector<int> Pi_(p.length()+1);                //m¹drzejsza tablica

     Pi_[0]=-1;
     int i=0;
     int j=-1;
     int n=p.length();
     while ( i <= n )
     {
           while ( j > -1 && p[i] != p[j] )
           {
                 j=Pi_[j];
           }
           i++;
           j++;
           if ( p[i] == p[j] )
           {
                Pi_[i] = Pi_[j];
           }
           else
           {
                Pi_[i] = j;
           }

     }
     return Pi_;            //Tablica PI'
}


int main(int argc, char *argv[])
{
    srand(time(NULL));

    int n=1;
    int licznik=0;
    int dl_wiersz=0;
    int ilosc_wiersz=0;
    string P;

    cout << "Podaj dlugosc ciagu: ";
    cin >> n;
    cout << endl;
    cout<<"\nPodaj dlugosc wiersza: ";
    cin >> dl_wiersz;

    if(n % dl_wiersz==0)
    ilosc_wiersz=n/dl_wiersz;
    else
    ilosc_wiersz=(n/dl_wiersz)+1;

char** T;
T=new char*[dl_wiersz];
  for (int i=0;i<dl_wiersz;i++)
    T[i]=new char[ilosc_wiersz];


    for (int j=0; j<ilosc_wiersz; j++)
    {
        for (int i=0; i<dl_wiersz; i++)
        {
            T[i][j]= char ( 'a' + rand() % 5 );
            licznik++;
            if (licznik>n)
            T[i][j]='\0';
        }
    }

licznik=0;
    cout << endl;
    for (int j=0; j<ilosc_wiersz ; j++)
    {
        for (int i=0; i<dl_wiersz; i++)
           cout<< T[i][j];
       cout<<"\n";
    }
    cout << endl;

    cout << "Podaj wzorzec: ";
    cin >> P;
    cout << endl;


    char znak[5];
    char znak1[5];
    string ww;

    znak[0]='k';
    znak[1]='l';
    znak[2]='u';
    znak[3]='c';
    znak[4]='z';
    znak[5]='\0';
    ww="klucz";
    znak1[0]='k';
    znak1[1]='l';
    znak1[2]='u';
    znak1[3]='c';
    znak1[4]='z';
    znak1[5]='\0';

    for (int a=0; a<5; a++)
    {
        cout<<ww[a];
    }
    cout<<"\n"<<endl;

    for (int a=0; a<5; a++)
    {
        if (ww[a]==znak1[a])
        {
            cout<<"spoko\n";
        }
        cout<<"nie pasuje\n\n";
        break;
    }


    szukaj(P,T,dl_wiersz, ilosc_wiersz, n);

    cout << endl;

/*
    //MORRIS-PRATT
    ////////////////////////////////////////////////////////////////////////////
    vector<int> tmp(P.length()+1);
    tmp=MP(P);
    cout << "===============MORRIS PRATT===============" << endl;
    for (int i=0; i<=P.length() ; i++)
    {
        cout << tmp[i] << "  ";
    }
    cout << endl;
    ////////////////////////////////////////////////////////////////////////////



    //KNUTH-MORRIS-PRATT
    ////////////////////////////////////////////////////////////////////////////

    tmp=KMP(P);
    cout << "=============KNUTH MORRIS PRATT===============" << endl;
    for (int i=0; i<=P.length() ; i++)
    {
        cout << tmp[i] << "  ";
    }
    cout << endl;
    ////////////////////////////////////////////////////////////////////////////


*/
    system("PAUSE");
    return 0;
}
2

user image
Nikt takiego spaghetti nie tknie. Wywal ten kod jeśli nie działa i napisz od nowa, z głową. Żadna funkcja nie może mieć więcej niż 20 linijek, ani więcej niż 1 poziom zagłębienia. Każda zmienna (i funkcja) ma mieć sensowną nazwę która jasno mówi co to jest (nazwy "pi", "war", "lok","t" to nie są sensowne nazwy)

1

To co powiedział @Shalom + na przykład tutaj masz wyjście poza zakres tablicy:

    char znak[5];
    char znak1[5];
    string ww;
 
    znak[0]='k';
    znak[1]='l';
    znak[2]='u';
    znak[3]='c';
    znak[4]='z';
    znak[5]='\0';

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