seth Temat założony przez niniejszego użytkownika |
[Lekcja 28.] Zadanie domowe.- problem z warunkami w pętli » 2012-03-03 22:39:36 Być może to jakiś głupi błąd początkującego, ala sam nie jestem w stanie dojść do tego co jest nie tak...
Mając kod:
std::string konwertuj( std::string & sTekst ) { std::string sWynik; size_t znalezionaPozycja1 = sTekst.find( " " ); size_t znalezionaPozycja2 = sTekst.find( "<b>" ); size_t znalezionaPozycja3 = sTekst.find( "</b>" ); do { if( znalezionaPozycja1 != std::string::npos ) { sWynik = sTekst.erase( znalezionaPozycja1, 1 ); znalezionaPozycja1 = sWynik.find( " ", znalezionaPozycja1 ); } if( znalezionaPozycja2 != std::string::npos ) { sWynik = sWynik.erase( znalezionaPozycja2, 3 ); sWynik = sWynik.insert( znalezionaPozycja2, "[b]" ); znalezionaPozycja2 = sWynik.find( "<b>", znalezionaPozycja2 + 3 ); } if( znalezionaPozycja3 != std::string::npos ) { sWynik = sWynik.erase( znalezionaPozycja3, 4 ); sWynik = sWynik.insert( znalezionaPozycja3, "[/b]" ); znalezionaPozycja3 = sWynik.find( "</b>", znalezionaPozycja3 + 4 ); } } while(( znalezionaPozycja1 != std::string::npos ) &&( znalezionaPozycja2 != std::string::npos ) &&( znalezionaPozycja3 != std::string::npos ) ); return sWynik; }
Program powycina nadmiarowe spacje, jednak nie zastąpi znaczników.
Z kolei wprowadzając:
while(( znalezionaPozycja1 != std::string::npos ) ||( znalezionaPozycja2 != std::string::npos ) ||( znalezionaPozycja3 != std::string::npos ) );
Zostaje wycięta tylko jedna nadmiarowa spacja, oraz podmieniane znacznimi.
Oczywiście wyniesienie poszczególnych if'ów do osobnych pętli daje pożadane efekty, jednak ciekawi mnie dlaczego ww. kod nie działa. Jeśli ktoś podpowie co zrobiłem nie tak, będę wdzięczny. |
|
GoldWolf |
» 2012-03-07 13:27:48 Wrzuć cały program, bo tak to możemy z fusów wróżyć co się stało. |
|
GoldWolf |
» 2012-03-07 13:27:48 Wrzuć cały program, bo tak to możemy z fusów wróżyć co się stało. |
|
GoldWolf |
» 2012-03-07 13:27:52 Wrzuć cały program, bo tak to możemy z fusów wróżyć co się stało.
PS adekwatnie się to jakoś trubluje u Was ;-) |
|
seth Temat założony przez niniejszego użytkownika |
» 2012-03-08 21:52:58 Całość to tak na prawdę nie wiele więcej, a wygląda to tak:
#include <iostream> #include <string>
std::string konwertuj( std::string & sTekst ) { std::string sWynik; size_t znalezionaPozycja1 = sTekst.find( " " ); size_t znalezionaPozycja2 = sTekst.find( "<b>" ); size_t znalezionaPozycja3 = sTekst.find( "</b>" ); do { if( znalezionaPozycja1 != std::string::npos ) { sWynik = sTekst.erase( znalezionaPozycja1, 1 ); znalezionaPozycja1 = sWynik.find( " ", znalezionaPozycja1 ); } if( znalezionaPozycja2 != std::string::npos ) { sWynik = sWynik.erase( znalezionaPozycja2, 3 ); sWynik = sWynik.insert( znalezionaPozycja2, "[b]" ); znalezionaPozycja2 = sWynik.find( "<b>", znalezionaPozycja2 + 3 ); } if( znalezionaPozycja3 != std::string::npos ) { sWynik = sWynik.erase( znalezionaPozycja3, 4 ); sWynik = sWynik.insert( znalezionaPozycja3, "[/b]" ); znalezionaPozycja3 = sWynik.find( "</b>", znalezionaPozycja3 + 4 ); } } while(( znalezionaPozycja1 != std::string::npos ) &&( znalezionaPozycja2 != std::string::npos ) &&( znalezionaPozycja3 != std::string::npos ) ); return sWynik; }
int main() { std::string tekst = "<b>to jest </b> testowy napis :)"; std::cout << tekst << std::endl; std::cout << konwertuj( tekst ) << std::endl; return 0; }
|
|
pekfos |
» 2012-03-09 15:14:23 10 znaków w nazwie zmiennej to już chyba granica między opisowością nazwy a nieczytelnością kodu.. int LiczbaMajacaZaZadanieZliczanieIlosciWystapienZnacznikaBWeWczytanymSkrypcie = 0; |
|
seth Temat założony przez niniejszego użytkownika |
» 2012-03-11 16:34:38 Właściwie nazwy zmiennych były nazwami z poprzednich lekcji kursu :), ale fakt można były to nazwać trochę "przystępniej".
Jeśli chodzi o program już wiem co było nie tak - pomimo że, w programie występuje "0", oznacza ono pozycję wystąpienia szukanej frazy, a nie liczbę zliczającą ilość wystąpień. Tak więc w przypadku:
znalezionaPozycja2 = 0;
warunek
znalezionaPozycja2 != std::string::npos
Był spełniony.
Błąd był w pierwszym if'ie, gdzie operowałem na 2 zmiennych:
sWynik = sTekst.erase( znalezionaPozycja1, 1 );
Właściwie nie wiedzieć po co - zmienna "sWynik" tak na prawdę w ogóle nie jest potrzebna.
Dzięki za pomoc, zainteresowanie tematem, poprawiony kod w którym ładnie widać po kolei co się dzieje załączam poniżej, może komuś się przyda...
#include <iostream> #include <string>
std::string konwertuj( std::string & sTekst ) { std::string fraza1 = " "; std::string fraza2 = "<b>"; std::string fraza3 = "</b>"; size_t znalezionaPozycja1 = sTekst.find( fraza1 ); size_t znalezionaPozycja2 = sTekst.find( fraza2 ); size_t znalezionaPozycja3 = sTekst.find( fraza3 ); int licznik = 1; std::cout << "Pozycja1 (przed petla): " << znalezionaPozycja1 << std::endl; std::cout << "Pozycja2 (przed petla): " << znalezionaPozycja2 << std::endl; std::cout << "Pozycja3 (przed petla): " << znalezionaPozycja3 << std::endl; do { std::cout << "\nPrzejscie petli: " << licznik << std::endl; if( znalezionaPozycja1 != std::string::npos ) { sTekst = sTekst.erase( znalezionaPozycja1, 1 ); znalezionaPozycja1 = sTekst.find( fraza1, znalezionaPozycja1 ); std::cout << "Pozycja1: " << znalezionaPozycja1 << std::endl; } if( znalezionaPozycja2 != std::string::npos ) { sTekst = sTekst.erase( znalezionaPozycja2, 3 ); sTekst = sTekst.insert( znalezionaPozycja2, "[b]" ); znalezionaPozycja2 = sTekst.find( fraza2, znalezionaPozycja2 + fraza2.size() ); std::cout << "Pozycja2: " << znalezionaPozycja2 << std::endl; } if( znalezionaPozycja3 != std::string::npos ) { sTekst = sTekst.erase( znalezionaPozycja3, 4 ); sTekst = sTekst.insert( znalezionaPozycja3, "[/b]" ); znalezionaPozycja3 = sTekst.find( fraza3, znalezionaPozycja3 + fraza3.size() ); std::cout << "Pozycja3: " << znalezionaPozycja3 << std::endl; } licznik++; std::cout << sTekst; std::cout << std::endl; } while(( znalezionaPozycja1 != std::string::npos ) ||( znalezionaPozycja2 != std::string::npos ) ||( znalezionaPozycja3 != std::string::npos ) ); return sTekst; }
int main() { std::string tekst = "<b>to jest </b> testowy napis :)"; std::cout << tekst << std::endl; std::cout << konwertuj( tekst ) << std::endl; return 0; }
|
|
« 1 » |