NeonArmageddon Temat założony przez niniejszego użytkownika |
[C++] wczytywanie długości stringa » 2020-04-22 20:18:42 Witam, napisałem w języku C++ program, który ma służyć szukaniu wzorca w tekście, i o ile kod się kompiluje i z pozoru wszystko działa, program wiesza się wczytując długość tekstu. Ponadto, gdy dodałem linijkę z wypisaniem długości tekstu, jeżeli w tekście jest spacja to liczy tylko znaki które są przed nią. Ponadto mam wątpliwości czy wszystko jest ok z przekazywaniem tablic do funkcji, jak chociażby z tablicą p, ale jest to już problem drugorzędny. Poniżej kod programu: #include <iostream> #include <string> using namespace std;
void szukanie_naiwne( char tekst[], char wzorzec[], int dl_t, int dl_w ); void szukanie_tablicy_dopasowan( char wzorzec[], int dl_w, int p[] ); void szukanie_kmp( char wzorzec[], char tekst[], int dl_w, int dl_t, int p[] );
int main() { char tekst[ 100 ], wzorzec[ 100 ]; int dl_t, dl_w; int p[ 100 ]; string tek, wz; int odpowiedz = 1; cout << "Menu programu" << endl; cout << "1. wczytaj tekst" << endl; cout << "2. wczytaj wzorzec" << endl; cout << "3. szukaj wzorca metoda naiwna" << endl; cout << "4. szukaj wzorca metoda" << endl; int wybor; while( odpowiedz != 0 ) { cin >> wybor; switch( wybor ) { case 1: cout << "Podaj tekst" << endl; cin >> tek; dl_t = tek.length(); cout << "tekst sklada sie z " << dl_t << " znakow" << endl; for( int i = 0; i < dl_t; i++ ) { tekst[ i ] = tek[ i ]; } break; case 2: cout << "Podaj wzorzec" << endl; cin >> wz; dl_w = wz.length(); for( int i = 0; i < dl_t; i++ ) { wzorzec[ i ] = wz[ i ]; } break; case 3: szukanie_naiwne( tekst, wzorzec, dl_t, dl_w ); break; case 4: szukanie_tablicy_dopasowan( wzorzec, dl_w, p ); szukanie_kmp( wzorzec, tekst, dl_w, dl_t, p ); break; } } cout << "Podaj tekst: "; cin.getline( tekst, 100 ); cout << "Podaj wzorzec: "; cin.getline( wzorzec, 100 ); }
void szukanie_naiwne( char tekst[], char wzorzec[], int dl_t, int dl_w ) { int i = 0; while( i <= dl_t - dl_w ) { int j = 0; while( j < dl_w && wzorzec[ j ] == tekst[ i + j ] ) { j++; } if( j == dl_w ) { cout << i << endl; } i++; } }
void szukanie_tablicy_dopasowan( char wzorzec[], int dl_w, int p[] ) { p[ 0 ] = 0; p[ 1 ] = 0; int t = 0; int i = 1; while( i < dl_w ) { while( t > 0 && wzorzec[ t ] != wzorzec[ i ] ) { t = p[ t ]; } if( wzorzec[ t ] == wzorzec[ i ] ) { t++; } p[ i + 1 ] = t; i++; } }
void szukanie_kmp( char wzorzec[], char tekst[], int dl_w, int dl_t, int p[] ) { int i = 0; int j = 0; while( i < dl_t - dl_w + 1 ) { while( wzorzec[ j ] == tekst[ i + j ] && j < dl_w ) { j++; } if( j == dl_w ) { cout << i << endl; } i = i + max( 1, j - p[ j ] ); j = p[ j ]; } }
Z góry dziękuję :D |
|
pekfos |
» 2020-04-22 20:23:46 Mieszasz dl_t z dl_w. Nie wiem po co w ogóle kopiujesz tekst do tablic, skoro już masz go w stringu. Potencjalnie przepełniasz wtedy tablice. Użyj std::getline() do wczytywania tekstu, żeby wczytać całą linię, a nie tylko do pierwszego białego znaku. |
|
NeonArmageddon Temat założony przez niniejszego użytkownika |
» 2020-04-22 20:41:09 Przerobiłem case 1 i 2 ze switcha na coś takiego: cout << "Podaj tekst" << endl; getline( cin, tekst ); dl_t = tekst.length(); cout << "tekst sklada sie z " << dl_t << " znakow" << endl;
pozbywając się zupełnie tabel charów, ale teraz nie daje mi nic wpisać, po prostu podaje od razu, że tekst składa się z 0 znaków. Czy to coś nie tak ze składnią getline? Edit: Zmieniłem na getline( cin >> ws, tekst );
i program śmiga jak trzeba, dziękuję bardzo za pomoc :D |
|
pekfos |
» 2020-04-22 22:07:22 |
|
« 1 » |