Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] wczytywanie długości stringa

Ostatnio zmodyfikowano 2020-04-22 22:07
Autor Wiadomość
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:

C/C++
#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
P-176715
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.
P-176716
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:

C/C++
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

C/C++
getline( cin >> ws, tekst );

i program śmiga jak trzeba, dziękuję bardzo za pomoc :D
P-176717
pekfos
» 2020-04-22 22:07:22
» Kurs C++ / FAQstd::getline() mi nie działa! pytanie/odpowiedź
P-176718
« 1 »
  Strona 1 z 1