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: int main() { int i, j = 0; std::string znaki; std::string znaki_bs[ 10 ]; std::getline( std::cin, znaki ); char cstr[ znaki.size() + 1 ]; strcpy( cstr, znaki.c_str() ); for( i = 0; i < znaki.size(); i++ ) { if( cstr[ i ] != ' ' ); { znaki_bs[ j ] = cstr[ i ]; 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. |
|
pekfos |
» 2018-10-24 18:30:20 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? std::string znaki_bs[ 10 ];
|
Jak te 10 ciągów znaków ma przechowywać ciąg znaków? |
|
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: int main() { int i, j = 0; int licznik_spacji = 0; int dlugosc_bs, dlugosc; std::string znaki; std::getline( std::cin, znaki ); dlugosc = znaki.size() + 1; char cstr[ dlugosc ]; strcpy( cstr, znaki.c_str() ); 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 ) ) { znaki_bs[ j ] = cstr[ i ]; 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. |
|
pekfos |
» 2018-10-24 19:33:40 Tablice jednowymiarowe, czerwona ramka. Po co w ogóle ci ta tablica? Nie prościej czytać ze stringa i zapisywać do stringa..? |
|
Filippo9669 Temat założony przez niniejszego użytkownika |
» 2018-10-26 22:16:47 Racja. A co sądzisz o tym? int main() { int i, j = 0; int licznik_spacji = 0; string znaki; string znaki_bs; getline( cin, znaki ); 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" ); }
|
|
pekfos |
» 2018-10-26 22:28:26 Przekombinowane. |
|
Filippo9669 Temat założony przez niniejszego użytkownika |
» 2018-10-26 22:31:11 string::erase? |
|
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. |
|
« 1 » 2 |