[Rozdział 28] Zadanie domowe
Ostatnio zmodyfikowano 2016-02-05 16:15
baddevil96 Temat założony przez niniejszego użytkownika |
[Rozdział 28] Zadanie domowe » 2016-02-04 22:01:54 Problem jest taki, program nie wymazuje wszystkich spacji z tekstu, tylko jedną, a reszte pomija... Zastanawiałem sie troche lecz moim zdaniem wszystko jest dobrze, prosze o pomoc :( #include <iostream> #include <string> using namespace std;
std::string konwertuj( std::string & sTekst ) { std::string sWynik; string szukanaFraza = " "; string szukanaFraza2 = "<b>"; string szukanaFraza3 = "</b>"; string zastapFraza = " "; string zastapFraza2 = "[b]"; string zastapFraza3 = "[/b]"; int i = 0; size_t flaga = 0; size_t flaga2 = 0; do { flaga = sTekst.find( szukanaFraza, flaga ); flaga2 = sTekst.find( szukanaFraza, flaga + 1 ); sTekst.erase( flaga, szukanaFraza.size() ); if( flaga + 1 != flaga2 ) { sTekst.insert( flaga, " " ); } flaga = sTekst.find( szukanaFraza, flaga + szukanaFraza.size() ); if( flaga != std::string::npos ) { } } while( flaga != std::string::npos ); flaga = 0; do { flaga = sTekst.find( szukanaFraza2, flaga ); sTekst.erase( flaga, szukanaFraza2.size() ); sTekst.insert( flaga, zastapFraza2 ); flaga = sTekst.find( szukanaFraza2, flaga + szukanaFraza2.size() ); } while( flaga != std::string::npos ); flaga = 0; do { flaga = sTekst.find( szukanaFraza3, flaga ); sTekst.erase( flaga, szukanaFraza3.size() ); sTekst.insert( flaga, zastapFraza3 ); flaga = sTekst.find( szukanaFraza3, flaga + szukanaFraza3.size() ); } while( flaga != std::string::npos ); return sTekst; } int main() { std::string tekst = "<b>to jest </b> testowy napis <b>:)"; std::cout << konwertuj( tekst ) << std::endl; return 0; }
|
|
carlosmay |
» 2016-02-04 23:55:21 trochę za krótko. moim zdaniem wszystko jest dobrze, |
a jednak nie działa. Swoją drogą nazwy zmiennych nieadekwatne do ich funkcji. size_t flaga = 0; size_t flaga2 = 0; |
Szukasz pozycji, więc może size_t pos = 0; size_t pos2 = 0; . Z tą spacją mocno przekombinowane. Jako szukaną frazę daj podwójną spację. Jeśli taką znajdzie usuń znalezioną pozycję i szukaj od tego miejsca. Jeżeli zostanie jedna spacja to jej nie znajdzie i przejdzie dalej przeszukiwać. |
|
baddevil96 Temat założony przez niniejszego użytkownika |
» 2016-02-05 13:02:15 Dzieki za rady, lecz w programie dalej tkwił problem, jeśli liczba spacji była parzysta to program je usuwał bez pozostawienia odstępu, po małej modyfikacji doprowadziłem fragment kodu do takiej postaci, i w tym momencie chyba działa jak należy: std::string sWynik; string szukanaFraza = " "; string szukanaFraza2 = "<b>"; string szukanaFraza3 = "</b>";
string zastapFraza = " "; string zastapFraza2 = "[b]"; string zastapFraza3 = "[/b]";
size_t flaga = 0; size_t flaga2 = 0;
do { flaga = sTekst.find( szukanaFraza, flaga ); flaga2 = sTekst.find( szukanaFraza, flaga + 1 ); if( flaga + 1 == flaga2 ) { do { sTekst.erase( flaga, szukanaFraza.size() ); flaga2 = sTekst.find( szukanaFraza, flaga + 1 ); flaga = sTekst.find( szukanaFraza, flaga ); } while( flaga + 1 == flaga2 ); } flaga = sTekst.find( szukanaFraza, flaga + 1 ); } while( flaga != std::string::npos );
|
|
carlosmay |
» 2016-02-05 16:15:34 Można też tak. size_t flaga = sTekst.find( szukanaFraza ); while( flaga != string::npos ) { if( sTekst[ flaga ] == sTekst[ flaga + 1 ] ) sTekst.erase( flaga, szukanaFraza.size() ); else flaga = sTekst.find( szukanaFraza, flaga + 1 ); } |
|
« 1 » |