rottingham Temat założony przez niniejszego użytkownika |
3.28 Usuwanie spacji » 2018-12-06 16:21:06 No dzień dobry! Ogółem to męczę się z napisaniem funkcji, która usuwałaby powielające się spacje. Napisałem do tej pory dziwny twór i w związku z tym, że jeszcze nie działa on do końca poprawnie (ale już coś tam działa) kłaniam się z prośbą, a w zasadzie to dwiema 1. Czy idę dobrym tokiem? 2. Jeżeli nie to proszę o drogowskaz na dobrą ścieżkę. Howgh! void modyfikujemy( string & tekst ) { int t[ 6 ]; size_t czySpacja; t[ 0 ] = czySpacja = tekst.find( " " ); int i = 1; do { cout << czySpacja << endl; t[ i ] = czySpacja = tekst.find( " ", czySpacja + 1 ); i++; } while( czySpacja != string::npos ); for( int i = 0; i < 6; i++ ) { cout << t[ i ] << endl; if(( t[ i ] + 1 ) == t[ i + 1 ] ) tekst.erase( t[ i ], 1 ); } }
|
|
rafallauterbach |
» 2018-12-06 17:03:01 void jedna_spacja( string & tekst ) { for( int i = 0; i < tekst.length() - 1; i++ ) { if( tekst[ i ] == ' ' ) while( tekst[ i + 1 ] == ' ' ) tekst.erease( i + 1 ); } } Piszę z telefonu i tu może coś nie działać, ale wydaje mi się że Twój przykład zbyt skomplikowałeś. Poczytaj o string.erease() i string.length() i jeśli coś nie działa to napraw w ramach zadania. Dobrym sposobem na wiedzę jest szukanie sobie dokumentacji, np dokumentacja string i masz tam wszystko co można z nim zrobić. Myślałem żeby specjalnie coś zepsuć ale nie wiedziałem co ;p Możesz np znaleźć sposób żeby usunąć wszystkie znaki z rzędu naraz po przeczytaniu referencji string zamiast usuwania po jednym (jak u mnie) |
|
pekfos |
» 2018-12-06 19:22:16 rafallauterbach: Cieszę się, że jesteś w stanie z głowy napisać jedno z naiwnych rozwiązań tego zadania, ale dawanie gotowego kodu to najmniej efektywny sposób niesienia pomocy na początku nauki programowania. Po co ci ta tablica t? Nie wiesz, ile jest spacji w tekście i dość prawdopodobne że będzie to więcej niż 6. |
|
rafallauterbach |
» 2018-12-06 23:38:21 Samo rozwiązanie mogło być krótsze i efektywniejsze, ale takie było łatwo zrozumiałe. No a z tym najgorszym sposobem... Pewnie zależy. |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2018-12-06 23:51:33 @rafallauterbach dzięki za pomoc! Co prawda nie patrzyłem jeszcze na gotowca, którego mi dałeś, ale rada odnośnie dokumentacji była pomocna, bo naprowadziło mnie to na rozwiązanie @pekfos - ok. Zakładając, że zrobię tablicę o ilości elementów więcej niż 6. Np. 10 000. Czy sam kierunek był dobry? Obecnie zmieniłem tok myślenia i napisałem takie rozwiązanie: void modyfikujemy( string & tekst ) { size_t czySpacja = tekst.find( " " ); do { tekst.erase( czySpacja, 2 ); cout << czySpacja << endl; czySpacja = tekst.find( " ", czySpacja + 1 ); } while( czySpacja != string::npos ); }
Rozwiązanie zdaje się działać. Czy ono jest waszym zdaniem poprawne, czy ma jakieś luki? |
|
pekfos |
» 2018-12-07 00:05:51 Rozwiązanie zdaje się działać. |
Nie działa dla parzystej ilości spacji pod rząd. Zakładając, że zrobię tablicę o ilości elementów więcej niż 6. Np. 10 000. Czy sam kierunek był dobry? |
Nie. Zwiększenie rozmiaru tablicy nie naprawia problemu jej przepełnienia. |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2018-12-07 00:22:46 No dobra... Więc wracam na inną drogę. Próbuję zrobić warunek korzystając z porównania i operacji logicznych, więc wklepuję: if(( czySpacja == " " ) &&( czySpacja + 1 == " " ) ) Otrzymuję wówczas od kompilatora komunikat: |13|warning: comparison with string literal results in unspecified behaviour [-Waddress]| |13|error: ISO C++ forbids comparison between pointer and integer [-fpermissive]| |13|warning: comparison with string literal results in unspecified behaviour [-Waddress]| |13|error: ISO C++ forbids comparison between pointer and integer [-fpermissive]| No i teraz pytanie czy mogę mimo wszystko w jakiś sposób przeprowadzić te porównania? Jeżeli to jest możliwe, to w którym kierunku iść aby to zrobić? |
|
YooSy |
» 2018-12-07 00:43:14 czySpacja to liczba, a " " łańcuch znaków, więc nie da się ich porównać. Gdy znajdziesz pozycję spacji użyj tej wartości jako indeks tablicy (Stringa). |
|
« 1 » 2 3 4 |