[c++] Rozdział 28 - Wykroczenie poza zasięg pamięci
Ostatnio zmodyfikowano 2015-08-24 15:27
Bonobo Temat założony przez niniejszego użytkownika |
[c++] Rozdział 28 - Wykroczenie poza zasięg pamięci » 2015-08-24 02:36:29 Witam Robiąc prace domową do zadania 28 (modyfikowanie tekstu) natrafiłem na problem z metodą erase(), mianowicie wykraczam poza pamięć (std::out_of_range at memory location...). Wszystko mi się kompiluje, lecz przez metodę erase i jej rozrzutność po pamięci nie mogę sprawdzić czy wszystko działa, a z moją wiedzą nie potrafię namierzyć problemu:) Z góry dziękuję za pomoc :)
#include "stdafx.h" #include <iostream> #include <conio.h> #include <string>
using namespace std;
void szukanie( string & ftekst ) { size_t znaleziono; do { znaleziono = ftekst.find( "<b>" ); ftekst.erase( znaleziono, 3 ); ftekst.insert( znaleziono, "[b]" ); } while( znaleziono != string::npos ); do { znaleziono = ftekst.find( "</b>" ); ftekst.erase( znaleziono, 3 ); ftekst.insert( znaleziono, "[/b]" ); } while( znaleziono != string::npos ); do { znaleziono = ftekst.find( " " ); ftekst.erase( znaleziono, 1 ); } while( znaleziono != string::npos ); }
int main() { string tekst = "<b>to jest </b> testowy napis <b>:)"; cout << tekst; szukanie( tekst ); cout << tekst; _getch(); return 0; }
|
|
1aam2am1 |
» 2015-08-24 08:43:29 for( znaleziono = ftekst.find( "<b>" ); znaleziono != string::npos; znaleziono = ftekst.find( "<b>" ) ) { ftekst.erase( znaleziono, 3 ); ftekst.insert( znaleziono, "[b]" ); }
|
|
mateczek |
wyjaśnienie problemu na zdjęciu!!! » 2015-08-24 08:49:44 http://fotozrzut.pl/zdjecia/cc2d91752f.png. Pętla wykonuje się po raz trzeci. I zmienna znaleziono przyjmuje kosmiczną wartość. Dwa pierwsze znaczki podmienia Ci zajebiście. Ale za trzecim razem znajduje kosmos. Metoda erese chce coś usunąć z tej kosmicznej przestrzeni:) i jest ka-bum używaj debuggera będziesz miał łatwiej :P https://pl.wikibooks.org/wiki/Programowanie_C%2B%2B_Qt4_w_systemie_Gnu-Linux/U%C5%BCywaj_Debuggera!!!. dodaj warunek przed erase np. w stylu: if( znaleziono > sitring.size() ) break; Ogólnie to zły rodzaj pętli do tego zadania wybrałeś. Bo nawet jak znaleziono nic nie znajdzie to erase i tak spróbuje się wykonać!!! Więc pętla do tego zadania idealna to taka, która na wstępie sprawdza warunek :) lub nieskończona z funkcją wyjścia while( 1 ) { if( znaleziono > sitring.size() ) break; }
|
|
mateczek |
masz koda :) » 2015-08-24 10:40:00
#include <iostream> #include <string>
using namespace std;
void szukanie( string & ftekst ) { while( true ) { size_t znaleziono = ftekst.find( "<b>" ); if( znaleziono >= ftekst.size() ) break; ftekst.erase( znaleziono, 3 ); ftekst.insert( znaleziono, "[b]" ); } size_t znaleziono = ftekst.find( "</b>" ); while( znaleziono < ftekst.size() ) { ftekst.erase( znaleziono, 3 ); ftekst.insert( znaleziono, "[/b]" ); znaleziono = ftekst.find( "</b>" ); } for( znaleziono = ftekst.find( " " ); znaleziono != string::npos; znaleziono = ftekst.find( " " ) ) { ftekst.erase( znaleziono, 1 ); } }
int main() { string tekst = "<b>to jest </b> testowy napis <b>:)"; cout << tekst << endl; szukanie( tekst ); cout << tekst << endl; cin.ignore(); return 0; }
|
|
Bonobo Temat założony przez niniejszego użytkownika |
» 2015-08-24 15:27:05 Dziękuję bardzo za pomoc, wszystko już działa :) Oczywiście musiałem zrobić po sowjemu więc zostałem przy swojej pętli dodając znaleziono = ftekst.find( "<b>" ); przed sprawdzeniem warunku. Ale znam już nawet alternatywy dla tego zadania :D Dziękuje jeszcze raz i pozdrawiam :) |
|
« 1 » |