Szymon2727 |
» 2015-08-04 21:17:03 Nie wiem po co tak kombinujesz - usuń dane, a potem je dodaj - jeżeli przeczytałeś kurs to jedyny problem z insertem i appednem będzie co najwyżej z podaniem lokalizacji usunięcia/dodania tekstu. |
|
Braile Temat założony przez niniejszego użytkownika |
» 2015-08-05 11:25:52 Już rozumiem. Nie wiem czemu miałem taki mętlik w głowie. Program działa już prawie tak jak powinien. Mam problem tylko z usunięciem nadmiarowych spacji tj. pętla ta wykonuje się tylko raz. #include<iostream> #include<string> using namespace std;
string konwertuj( string & tekst ) { string sWynik; string fraza1 = "<"; string fraza2 = ">"; string nowafraza1 = "["; string nowafraza2 = "]"; string spacja = " "; size_t znalezionyznacznik1 = tekst.find( fraza1 ); size_t znalezionyznacznik2 = tekst.find( fraza2 ); size_t znalezionaspacja = tekst.find( spacja ); do { sWynik = tekst.erase( znalezionyznacznik1, fraza1.size() ); sWynik = tekst.insert( znalezionyznacznik1, nowafraza1 ); znalezionyznacznik1 = tekst.find( fraza1, znalezionyznacznik1 + fraza1.size() ); } while( znalezionyznacznik1 != string::npos ); do { sWynik = tekst.erase( znalezionyznacznik2, fraza2.size() ); sWynik = tekst.insert( znalezionyznacznik2, nowafraza2 ); znalezionyznacznik2 = tekst.find( fraza2, znalezionyznacznik2 + fraza2.size() ); } while( znalezionyznacznik2 != string::npos ); do { sWynik = tekst.erase( znalezionaspacja, spacja.size() ); znalezionaspacja = tekst.find( spacja, znalezionaspacja + spacja.size() ); } while( znalezionaspacja != string::npos ); return sWynik; }
int main() { string tekst = "<b>to jest </b> testowy napis :)"; cout << konwertuj( tekst ); return 0; }
|
|
pekfos |
» 2015-08-05 11:51:06 sWynik = tekst.erase( znalezionaspacja, spacja.size() ); znalezionaspacja = tekst.find( spacja, znalezionaspacja + spacja.size() );
|
Nie masz usuwać całej frazy, tylko jej pierwszy znak. Nie wstawiasz tu nic w znalezione miejsce, więc nie możesz przeskoczyć o spacja.size() do przodu przy następnym poszukiwaniu. Po co tu zmienna sWynik..? Ta wersja erase zwraca stringa, na którym została wywołana, więc niepotrzebnie kopiujesz przetwarzany tekst do niepotrzebnej zmiennej przy każdej operacji. sWynik będzie miało tą samą wartość, co tekst. Do tego, tekst przekazujesz przez referencję, więc operujesz na obiekcie z main(), po co w ogóle chcesz tu coś zwracać? Skąd ty właściwie bierzesz te, coraz to nowe, dziwne zapisy w kodzie..? |
|
Szymon2727 |
» 2015-08-05 13:06:28 Człowieku przestań kombinować, pętle są zbędne, a do wykonania samego zadania wystarczy tylko wypisanie odpowiednio erase i append/insert. |
|
pekfos |
» 2015-08-05 13:42:36 Człowieku przestań kombinować, pętle są zbędne |
Nie są zbędne. Program ma przetworzyć wszystkie znaczniki, niezależnie od ilości. Tylko w przykładowych danych jest po jednym znaczniku. Odstępów jest już więcej. |
|
Braile Temat założony przez niniejszego użytkownika |
» 2015-08-05 15:47:58 Okej, program działa już poprawnie, wiem już na czym polegał mój błąd i zrozumiałem wreszcie temat w 100% ! Dziękuję za pomoc, a szczególnie za cierpliwość :) A co do przypisywania tej zmiennej sWynik to zauważyłem, że operuje na głównym tekście dzięki przekazywania argumentów przez referencję i mogę sobie ją odpuścić i nie zwracać funkcją żadnej wartości, ale do zadania był fragment aplikacji, który mogę wykorzystać. Nie doczytałem, że jest to tylko możliwość, a nie konieczność, dlatego dziękuję także za przypomnienie tej kwestii dzięki, której mogłem bardziej zoptymalizować kod. #include <iostream> #include <string>
std::string konwertuj( std::string & sTekst ) { std::string sWynik; return sWynik; } int main() { std::string tekst = "<b>to jest </b> testowy napis <b>:)"; std::cout << konwertuj( tekst ) << std::endl; return 0; }
Akutalnie mój kod wygląda tak: #include<iostream> #include<string> using namespace std;
void konwertuj( string & sTekst ) { string fraza1 = "<"; string fraza2 = ">"; string nowafraza1 = "["; string nowafraza2 = "]"; string spacja = " "; size_t znalezionyznacznik1 = sTekst.find( fraza1 ); size_t znalezionyznacznik2 = sTekst.find( fraza2 ); size_t znalezionaspacja = sTekst.find( spacja ); do { sTekst.erase( znalezionyznacznik1, fraza1.size() ); sTekst.insert( znalezionyznacznik1, nowafraza1 ); znalezionyznacznik1 = sTekst.find( fraza1, znalezionyznacznik1 + fraza1.size() ); } while( znalezionyznacznik1 != string::npos ); do { sTekst.erase( znalezionyznacznik2, fraza2.size() ); sTekst.insert( znalezionyznacznik2, nowafraza2 ); znalezionyznacznik2 = sTekst.find( fraza2, znalezionyznacznik2 + fraza2.size() ); } while( znalezionyznacznik2 != string::npos ); do { sTekst.erase( znalezionaspacja, 1 ); znalezionaspacja = sTekst.find( spacja ); } while( znalezionaspacja != string::npos ); cout << sTekst << endl; }
int main() { string tekst = "<b>to jest </b> testowy napis :)"; konwertuj( tekst ); return 0; }
|
|
Braile Temat założony przez niniejszego użytkownika |
» 2015-08-05 23:29:10 Otwieram, ponieważ gnębi mnie jedna myśl. Pytanie z jednej strony zgodne z tematem, z drugiej strony jednak nie, ponieważ nie odnosi się do zadania, a do rozdziału 28, konkretniej metody find. Zakładając, że nie znam metody(?) eof(), o której do tego momentu bieżącego kursu nie powinienem mieć pojęcia, to gdybym miał w jakimś pliku x liczb, których nie wiem ile jest, ale chciałbym je zliczyć, to do pętli mogę przykładowo napisać taki kod ?: void( string sNazwaPliku ) { (...) int a; size_t znalezionoliczb = sNazwaPliku.find( a ); (...) }
I czy teraz metoda find znajdzie ile jest pozycji liczb całkowitych, dzięki typowi int, tak żebym mógł wykorzystać tą ilość pozycji do późniejszej pętli ? Dodam, że taki zapis działał i dzięki pętli byłem w stanie wczytać wszystkie liczby wpisane do pliku, oczywiście był to kod bardziej poplątany i zagmatwany niż z pętlą, w której korzystałem z metody eof, jednak bardziej chciałbym wiedzieć dla siebie, czy taki zapis wyszukiwania liczb w pliku jest poprawny ? Nie jestem w stanie napisać tego o czym myślę ;__;. Mam nadzieję, że zrozumiecie ocb :) |
|
pekfos |
» 2015-08-06 11:45:56 Nie. |
|
1 2 « 3 » |