Run-Time Check Failure #2 - Kod kilkunastolinijkowy.

0

Cześć, jestem początkujący w programowaniu i nie potrafię poradzić sobie z tym błędem.
Moim celem jest napisanie kompresji LZ77 z wykorzystaniem algorytmu KMP i bufora cyklicznego na tablicy.
Na początku zabrałem się za poznanie algorytmu KMP i już napotkałem problem.
Przy korzystaniu z funkcji prefiksowej pojawia mi się błąd:

Run-Time Check Failure #2 - Stack around the variable 'wzorzec' was corrupted.

#include <conio.h>
#include <iostream>
using namespace std;
 

 
int main()
{
char wzorzec[3];
int P[3];
int t, i, j;
int m=3;
cin>>wzorzec;

P[0]=1; i=0;
for(j=2 ; j<=m ; j++)
	while( (i>0 ) && (wzorzec[i+1]!=wzorzec[j]) ) i=P[i];
	if( wzorzec[i+1] = P[j] ) i++;
		P[j] = i;

_getch();
return 0;
} 

0
char wzorzec[3];
...
cin>>wzorzec;

Nie podoba mi się to. Wczytujesz ciąg znaków do tablicy znaków wzorzec, ale ta tablica ma tylko 3 elementy – a ty nie sprawdzasz, ile elementów wczytujesz. Być może chodzi o to, że wczytujesz więcej znaków, niż mieści tablica, więc zapisujesz wczytane znaki do pamięci poza tą tablicą.

Poczytaj o stringach w C++.
#include <string>
Będzie Ci prościej nimi operować. Nie mają tego problemu, o którym piszę wyżej.

0

Próbuje na wszelkie możliwe sposoby. Stworzyłem algorytm KMP który

  1. Wyszukuje wzorzec w tekście i podaje jego miejsce.
  2. Wyszukuje najlepsze dopasowanie np: jeśli wzorcem jest

abcd
a tekst to
abcabcabca

to wyszuka pierwsze najdłuższe dopasowanie, poda jego miejsce i długość dopasowania
ale kod działa tylko gdy litery ze wzorca są na 8 miejscu w tekście dalej nie szuka.

#include <iostream>
#include <conio.h>
#include <string>
using namespace std;


int main()
{
	string wzorzec;
	string tekst;
	int m,n,i,j,t;
	int P[3];
	cin>>wzorzec;
	cin>>tekst;
	n=10;
	m=3;

	P[0]=0; P[1]=0; t=0;
	for (j=2; j<=m; j++)
	{
	while ((t>0)&&(wzorzec[t]!=wzorzec[j-1])) t=P[t];
	if (wzorzec[t]==wzorzec[j-1]) t++;
	P[j]=t;
	}
		
	int miejsce, dlugosc=0, temp=0;

	i=1; j=0;
	while (i<=n-m+1)
	{
	j=P[j];
	while((j<m)&&(wzorzec[j]==tekst[i+j-1])) 
	{
		temp++;
		if(dlugosc<temp)
		{
			dlugosc=temp;
			miejsce=i;
		}
		j++;
	}
	temp=0; 
	if (j==m) cout<<i<<endl;
	i=i+max(1,j-P[j]);
	}
	cout<<"Miejsce"<<miejsce<<" "<<"Dlugosc"<<dlugosc;

	_getch();
	return 0;
} 
0

Twój blad oznacza ze piszesz po pamieci, a konkretnie po stosie w momencie jak wczytujesz wzorzec. Generalnie jak pisze @kmph najlepiej korzystac z klasy string. Alternatywnie mozesz uzyc fgets/scanf z limitem na liczbe znakow i zrobic troche wieksza tablice na wzorzec (wzorzec o dlugosci max 2 znaki to chyba troche malo :P (3 znak to \0)

0

Zrobiłem tak jak poleciliście, program działa dobrze do momentu kiedy we wzorcu nie powtarza się jakiś ciąg znaków np:

abcxxxabc
Rozumiem że to błąd w samej realizacji algorytmu KMP ale obecnie nie potrafie go wychwycić.

A to wszystko tylko dlatego że chciałem zmodyfikować kod tak aby wyszukiwał częściowe dopasowanie wzorca do tekstu. Chyba sobie odpuszczę i napiszę zwykłą funkcje porównującą.

 #include <iostream>
#include <conio.h>
#include <string>
using namespace std;


int main()
{
	string wzorzec;
	string tekst;
	int m,n,i,j,t;
	int P[3];
	cout<<"Wprowadz wzorzec"<<endl;
	cin>>wzorzec;
	cout<<"Wprowadz tekst"<<endl;
	cin>>tekst;
	n=tekst.length();
	m=wzorzec.length();

	P[0]=0; P[1]=0; t=0;
	for (j=2; j<=m; j++)
	{
	while ((t>0)&&(wzorzec[t]!=wzorzec[j-1])) t=P[t];
	if (wzorzec[t]==wzorzec[j-1]) t++;
	P[j]=t;
	}

	int miejsce, dlugosc=0, temp=0;

	i=1; j=0;
	while (i<=n)
	{
	j=P[j];
	while((j<m)&&(wzorzec[j]==tekst[i+j-1])) 
	{
		temp++;
		if(dlugosc<temp)
		{
			dlugosc=temp;
			miejsce=i;
		}
		j++;
		if((i+j-1)==tekst.length()) break;
	}
	temp=0; 
	if (j==m) cout<<i<<endl;
	i=i+max(1,j-P[j]);
	}
	cout<<"Miejsce"<<miejsce<<" "<<"Dlugosc"<<dlugosc;

	_getch();
	return 0;
}
0

int P[3]; a dalej

for (j=2; j<=m; j++)
{
//
    P[j]=t;

więc jak m jest >=3 to się wysypie bo piszesz znów po nie swojej pamięci. W ogóle samo istnienie tej pętli wskazuje na błąd, bo tablica P ma tylko indeksy 0, 1 i 2 a u ciebie ta pętla startuje od 2 ;]

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