Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Rozdział 28 - Wykroczenie poza zasięg pamięci

Ostatnio zmodyfikowano 2015-08-24 15:27
Autor Wiadomość
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 :)
C/C++
// operacje_tekstowe.cpp :

#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;
}
P-136808
1aam2am1
» 2015-08-24 08:43:29
C/C++
for( znaleziono = ftekst.find( "<b>" ); znaleziono != string::npos; znaleziono = ftekst.find( "<b>" ) )
{
    ftekst.erase( znaleziono, 3 );
    ftekst.insert( znaleziono, "[b]" );
}
P-136809
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_sy​stemie_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

C/C++
while( 1 ) {
   
    if( znaleziono > sitring.size() ) break;
    //z funkcją wyjścia
}

P-136810
mateczek
masz koda :)
» 2015-08-24 10:40:00
C/C++
// operacje_tekstowe.cpp :


#include <iostream>
#include <string>

using namespace std;

void szukanie( string & ftekst )
{
    while( true ) {
        size_t znaleziono = ftekst.find( "<b>" );
        if( znaleziono >= ftekst.size() ) break; //warunek wyjścia
       
        ftekst.erase( znaleziono, 3 );
        ftekst.insert( znaleziono, "[b]" );
       
    }
   
    size_t znaleziono = ftekst.find( "</b>" );
    while( znaleziono < ftekst.size() )
    //while(znaleziono != string::npos) //można zamiennie z pętlą wyżej
    {
        ftekst.erase( znaleziono, 3 );
        ftekst.insert( znaleziono, "[/b]" );
        znaleziono = ftekst.find( "</b>" );
    }
   
    // poniżej pętla z forum zaproponowana przez 1aam2am1
   
    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;
}
P-136812
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 :)
P-136827
« 1 »
  Strona 1 z 1