Haryen Temat założony przez niniejszego użytkownika |
Lekcja 28 Zadanie domowe. » 2014-07-03 22:06:24 Cześć! Wykonałem zadanie domowe z lekcji 28.
#include <iostream> #include <string>
std::string konwertuj( std::string & sTekst ) { std::string sWynik; sTekst.erase( 23, 7 ); sTekst.erase( 29, 4 ); sTekst.erase( 0, 3 ); sTekst.insert( 0, "[b]" ); sTekst.erase( 11, 4 ); sTekst.insert( 11, "[/b]" ); sWynik = sTekst; return sWynik; } int main() { std::string tekst = "<b>to jest </b> testowy napis :)"; std::cout << konwertuj( tekst ) << std::endl; return 0; }
Ma ono tak wyglądać? To była krótka linijka, ale jakbym miał zrobić to samo na jakimś długim tekście to byłoby to bez sensu. Trzeba to zrobić inaczej? |
|
pekfos |
» 2014-07-03 22:07:15 Trzeba inaczej. |
|
Haryen Temat założony przez niniejszego użytkownika |
» 2014-07-03 22:10:00 To znaczy jak? Mam wyszukać pozycję, gdzie znajdują się znaki do usunięcia i wtedy je usuwać? |
|
pekfos |
» 2014-07-03 22:13:58 Znajdować frazy przez np find() i je usuwać/zastępować. "Napisz program, który z podanego łańcucha znaków usunie [..]". Nie masz prawa zakładać, że podany łańcuch jest dokładnie taki jak w zadaniu. Masz napisać funkcję, która wykona zadanie dla dowolnego podanego łańcucha. |
|
Haryen Temat założony przez niniejszego użytkownika |
» 2014-07-03 22:21:05 W większych projektach może nie, ale tu w zadaniu jest jasne powiedziane co mam zastąpić/usunąć. :P No ale ok, wykonam tak jak trzeba. Zrobiłem tak: #include <iostream> #include <string>
void B1( std::string & sTekst, std::string fraza ) { size_t pozycjaB1 = sTekst.find( fraza ); std::string noweB1 = "[b]"; sTekst.erase( pozycjaB1, fraza.size() ); sTekst.insert( pozycjaB1, noweB1 ); }
void B2( std::string & sTekst, std::string fraza ) { size_t pozycjaB2 = sTekst.find( fraza ); std::string noweB2 = "[/b]"; sTekst.erase( pozycjaB2, fraza.size() ); sTekst.insert( pozycjaB2, noweB2 ); }
void spacje( std::string & sTekst, std::string fraza ) { size_t pozycjaSpacji; do { pozycjaSpacji = sTekst.find( fraza ); if( pozycjaSpacji + 1 == std::string::npos ) continue; else sTekst.erase( pozycjaSpacji, 1 ); } while( pozycjaSpacji != std::string::npos ); }
std::string konwertuj( std::string & sTekst ) { std::string sWynik; B1( sTekst, "<b>" ); B2( sTekst, "</b>" ); spacje( sTekst, " " ); sWynik = sTekst; return sWynik; }
int main() { std::string tekst = "<b>to jest </b> testowy napis :)"; std::cout << konwertuj( tekst ) << std::endl; return 0; }
Ale program crashuje się, a winowajcą jest funkcja spacje. Nie wiem co jest nie tak. |
|
pekfos |
» 2014-07-04 16:56:53 if( pozycjaSpacji + 1 == std::string::npos )
|
To tak nie działa. Nie sprawdzasz też, czy do erase() nie podajesz npos. |
|
Haryen Temat założony przez niniejszego użytkownika |
» 2014-07-04 17:09:12 Ok, już działa. Nie wiedziałem jak wyszukiwać kilka spacji obok siebie, ale sprawdziłem w czyimś rozwiązaniu. #include <iostream> #include <string>
void B1( std::string & sTekst, std::string fraza ) { size_t pozycjaB1 = sTekst.find( fraza ); std::string noweB1 = "[b]"; sTekst.erase( pozycjaB1, fraza.size() ); sTekst.insert( pozycjaB1, noweB1 ); }
void B2( std::string & sTekst, std::string fraza ) { size_t pozycjaB2 = sTekst.find( fraza ); std::string noweB2 = "[/b]"; sTekst.erase( pozycjaB2, fraza.size() ); sTekst.insert( pozycjaB2, noweB2 ); }
void spacje( std::string & sTekst, std::string fraza ) { size_t pozycjaSpacji; do { pozycjaSpacji = sTekst.find( fraza ); if( pozycjaSpacji != std::string::npos ) { sTekst.erase( pozycjaSpacji, 1 ); } } while( pozycjaSpacji != std::string::npos ); }
std::string konwertuj( std::string & sTekst ) { std::string sWynik; B1( sTekst, "<b>" ); B2( sTekst, "</b>" ); spacje( sTekst, " " ); sWynik = sTekst; return sWynik; }
int main() { std::string tekst = "<b>to jest </b> testowy napis :)"; std::cout << konwertuj( tekst ) << std::endl; return 0; }
|
|
« 1 » |