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

Lekcja 28

Ostatnio zmodyfikowano 2015-12-12 20:37
Autor Wiadomość
Krway
Temat założony przez niniejszego użytkownika
Lekcja 28
» 2015-12-09 08:46:59
Witam.
Napisałem kod który ma dziwny błąd i nie po skompilowaniu przestaje działać a sam program nie wypisuje mi tekstu poza pętlą. Na dodatek kompilator nie wskazuje błędu
C/C++
#include <iostream>
#include <string>
using namespace std;
string konwertuj( string & sTekst )
{
    int p1[ 111 ], p2[ 101 ], p3[ 110 ]; //Tablice do zapisywania pozycji.
    int i1, i2, i3; //Indexy do tablic.
    int d1, d2, d3; //Dlugosci znakow.
    int i = 0;
    i1 = 0;
    i2 = 0;
    i3 = 0;
    string szu1 = "<b>";
    string szu2 = "</b>";
    string szu3 = "  ";
    string zm1 = "[b]";
    string zm2 = "[/b]";
    d1 = szu1.size();
    d2 = szu2.size();
    d3 = szu3.size();
    size_t zp1 = sTekst.find( szu1 );
    size_t zp2 = sTekst.find( szu2 );
    size_t zp3 = sTekst.find( szu3 );
    do
    {
        p1[ i1 ] = zp1;
        sTekst.erase( p1[ i1 ], d1 );
        sTekst.insert( p1[ i1 ], zm1 );
        zp1 = sTekst.find( szu1, zp1 + szu1.size() );
        i1++;
    } while( zp1 != string::npos );
   
    do
    {
        p2[ i2 ] = zp2;
        sTekst.erase( p2[ i2 ], d2 );
        sTekst.insert( p2[ i2 ], zm2 );
        zp2 = sTekst.find( szu2, zp2 + szu2.size() );
        i2++;
    } while( zp2 != string::npos );
   
    while( i < 5 )
    {
        do
        {
            p3[ i3 ] = zp3;
            if( p3[ i3 ] == 0 && i3 != 0 )
            {
                zp3 = sTekst.find( szu3, zp3 + szu3.size() );
                p3[ i3 ] = zp3;
            }
            sTekst.erase( p3[ i3 ], d3 );
            zp3 = sTekst.find( szu3, zp3 + szu3.size() );
            i3++;
        } while( zp3 != string::npos );
       
        i++;
        zp3 = 0;
        cout << sTekst << endl; //tu wypisuje
    }
    cout << sTekst; // tu nie wypisuje
}
int main()
{
    string tekst = "<b>to jest </b> testowy       napis     <b>:)";
    cout << konwertuj( tekst ) << endl;
    return 0;
}
 Po skompilowaniu jak wcześniej pisałem program się crashuje i wypisuje mi:
terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::erase

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Process returned 255 (0xFF)   execution time : 17.609 s
P-141649
carlosmay
» 2015-12-09 09:33:21
Program pada bo wychodzisz poza zakres string 'a.
P-141650
Krway
Temat założony przez niniejszego użytkownika
» 2015-12-10 13:51:03
Czyli? string ma określoną długość działania? Nie rozumiem i czy jest na to jakiś sposób?
P-141714
carlosmay
» 2015-12-10 14:08:04
string str = "Janek";
 Taki wyraz ma długość 5 znaków ( pozycje od 0 do 4).
Przypisując teraz do zmiennej 'str' inny wyraz to odpowiedni konstruktor klasy 'string'
przydzieli odpowiednią ilość pamięci na ten wyraz, ale po przydzieleniu pracując na tej
zmiennej musisz trzymać się określonego rozmiaru.
Zmienna string to tablica 'char', wiec operacje iteracyjne są takie same jak w każdej innej tablicy.
P-141715
carlosmay
» 2015-12-10 14:48:19
Szukanie pozycji realizuj na bieżąco (nie na poczatku dla wszystkich fraz).

Mocno przekombinowany kod.
Krok 1: usuń nadmiarowe spacje.
Krok 2: podmień znaki '<' na '[' oraz '>' na ']' (iterowanie po tablicy).
P-141719
Krway
Temat założony przez niniejszego użytkownika
» 2015-12-12 20:37:51
Dzięki! ;)
Twoja rada zmusiła mnie do naprawdę głębokiego przeanalizowania kodu i faktycznie wpisałem dużo niepotrzebnych rzeczy które wydawały mi się logiczne podczas tworzenia kodu.
P-141846
« 1 »
  Strona 1 z 1