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

Usuwanie spacji z tekstu

Ostatnio zmodyfikowano 2018-10-26 22:39
Autor Wiadomość
Filippo9669
Temat założony przez niniejszego użytkownika
Usuwanie spacji z tekstu
» 2018-10-24 14:29:27
Cześć! Piszę sobie mały program, którego jednym z elementów jest usuwanie spacji z wpisanego tekstu. Pomysł jest taki, żeby tekst wczytany do stringa kowertować na tablicę charów, po czym nowej tablicy charów w pętli przypisać tylko te elementy, które nie mają w sobie spacji (lub innego, dowolnego znaku). To część kodu:

C/C++
int main()
{
    int i, j = 0;
    std::string znaki; //przechowywanie ciagu znakow
    std::string znaki_bs[ 10 ]; //przechowywanie ciau znakow BEZ SPACJI
    std::getline( std::cin, znaki ); //wpisywanie ciagu znakow
   
    char cstr[ znaki.size() + 1 ];
    strcpy( cstr, znaki.c_str() ); //kopiowanie stringa do tablicy charow
   
    for( i = 0; i < znaki.size(); i++ )
    {
        if( cstr[ i ] != ' ' ); //jesli wykryto spacje
       
        {
            znaki_bs[ j ] = cstr[ i ]; //to nowy ciag znakow ja pomija przy przepisywaniu
            j++;
        }
    }
    std::cout << znaki_bs;
    system( "pause" );
}

Niestety, kod nie działa. Obiło mi się o oczy, że powyższy sposób deklaracji i inicjalizacji chara zezwala tylko na jego odczyt, ale nie jestem pewien.

PS. wiem, że da się to zrobić na wiele innych sposobów, ale mnie interesuje właśnie ten, bo napotkałem na problem, ktróego nie rozumiem.
Pozdrawiam.
P-172660
pekfos
» 2018-10-24 18:30:20
C/C++
char cstr[ znaki.size() + 1 ];
To nie jest poprawny sposób definiowania tablicy w C++.

Obiło mi się o oczy, że powyższy sposób deklaracji i inicjalizacji chara zezwala tylko na jego odczyt, ale nie jestem pewien.
Niby dlaczego?

C/C++
std::string znaki_bs[ 10 ]; //przechowywanie ciau znakow BEZ SPACJI
Jak te 10 ciągów znaków ma przechowywać ciąg znaków?
P-172666
Filippo9669
Temat założony przez niniejszego użytkownika
» 2018-10-24 19:09:15
To nie jest poprawny sposób definiowania tablicy w C++.

Dlaczego? Chodzi o to, że rozmiar jest podany za pomocą sumy, na dodatek parametru i stałej?

Jak te 10 ciągów znaków ma przechowywać ciąg znaków?

To prawda, tu jest jeden błąd.
Trochę zmieniłem kod, chwilowo wygląda tak:

C/C++
int main()
{
    int i, j = 0;
    int licznik_spacji = 0;
    int dlugosc_bs, dlugosc;
    std::string znaki; //przechowywanie ciagu znakow
    std::getline( std::cin, znaki ); //wpisywanie ciagu znakow
   
    dlugosc = znaki.size() + 1;
   
    char cstr[ dlugosc ];
    strcpy( cstr, znaki.c_str() ); //kopiowanie stringa do tablicy charow
   
    for( i = 0; i < znaki.size(); i++ )
    {
        if( cstr[ i ] == char( 32 ) )
        {
            licznik_spacji++;
        }
    }
   
    dlugosc_bs = znaki.size() + 1 - licznik_spacji;
    char * znaki_bs = new char[ dlugosc_bs ];
   
   
    for( i = 0; i < znaki.size(); i++ )
    {
        if( cstr[ i ] != char( 32 ) ) //jesli nie wykryto spacje
        {
            znaki_bs[ j ] = cstr[ i ]; //to nowy ciag znakow ja pomija przy przepisywaniu
            j++;
        }
    }
   
    std::cout << znaki_bs;
    delete[] znaki_bs;
   
    system( "pause" );
}
Niestety, dalej jest nie tak i chyba wygląda na to, że sam nie do końca rozumiem, co się w tym kodzie dzieje.
P-172668
pekfos
» 2018-10-24 19:33:40
» Kurs C++ » Poziom 2Tablice jednowymiarowe lekcja, czerwona ramka. Po co w ogóle ci ta tablica? Nie prościej czytać ze stringa i zapisywać do stringa..?
P-172669
Filippo9669
Temat założony przez niniejszego użytkownika
» 2018-10-26 22:16:47
Racja. A co sądzisz o tym?

C/C++
int main()
{
    int i, j = 0;
    int licznik_spacji = 0;
    string znaki; //przechowywanie ciagu znakow
    string znaki_bs; //przechowywanie ciagu znakow bez spacji
    getline( cin, znaki ); //wpisywanie ciagu znakow
   
    znaki_bs = znaki;
   
    for( i = 0; i < znaki.length() + 1; i++ )
    {
        if( znaki[ i ] == ' ' )
        {
            licznik_spacji++;
        }
    }
   
   
    for( i = 0; i < znaki.length() + 1; i++ )
    {
        if( znaki[ i ] != ' ' )
        {
            znaki_bs[ j ] = znaki[ i ];
            j++;
        }
    }
   
    znaki_bs = znaki_bs.substr( 0, znaki.length() - licznik_spacji );
   
    system( "pause" );
}
P-172684
pekfos
» 2018-10-26 22:28:26
Przekombinowane.
P-172685
Filippo9669
Temat założony przez niniejszego użytkownika
» 2018-10-26 22:31:11
string::erase?
P-172686
pekfos
» 2018-10-26 22:36:06
To by było mniej optymalne od tego co masz. Jeśli już, std::remove() robi to samo co masz napisane.

Twoja pierwsza pętla nic kompletnie nie wnosi. znaki.length() - licznik_spacji mógłbyś zmienić na j i efekt będzie ten sam. A jakbyś używał push_back() zamiast [] do dodawania znaków, substr() nie byłoby nawet potrzebne.
P-172687
« 1 » 2
  Strona 1 z 2 Następna strona