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

[Rozdział 28] Zadanie domowe

Ostatnio zmodyfikowano 2016-02-05 16:15
Autor Wiadomość
baddevil96
Temat założony przez niniejszego użytkownika
[Rozdział 28] Zadanie domowe
» 2016-02-04 22:01:54
Problem jest taki, program nie wymazuje wszystkich spacji z tekstu, tylko jedną, a reszte pomija... Zastanawiałem sie troche lecz moim zdaniem wszystko jest dobrze, prosze o pomoc :(
C/C++
#include <iostream>
#include <string>
using namespace std;

std::string konwertuj( std::string & sTekst )
{
   
    std::string sWynik;
    string szukanaFraza = " ";
    string szukanaFraza2 = "<b>";
    string szukanaFraza3 = "</b>"; //wyszukiwane frazy
   
    string zastapFraza = " ";
    string zastapFraza2 = "[b]";
    string zastapFraza3 = "[/b]"; //frazy ktore maja zastapic te znalezione
   
    int i = 0;
   
    size_t flaga = 0;
    size_t flaga2 = 0;
    do { // pierwsza petla dla " "
       
        flaga = sTekst.find( szukanaFraza, flaga );
        flaga2 = sTekst.find( szukanaFraza, flaga + 1 );
        sTekst.erase( flaga, szukanaFraza.size() );
        if( flaga + 1 != flaga2 ) { // Warunek sprawiajacy ze program zostawia jednak ta jedna spacje odstepu
            sTekst.insert( flaga, " " );
        }
       
        flaga = sTekst.find( szukanaFraza, flaga + szukanaFraza.size() );
        if( flaga != std::string::npos ) {
           
        }
       
    } while( flaga != std::string::npos );
   
    flaga = 0;
   
    do { // druga petla dla "[b]"
       
        flaga = sTekst.find( szukanaFraza2, flaga );
        sTekst.erase( flaga, szukanaFraza2.size() );
        sTekst.insert( flaga, zastapFraza2 );
        flaga = sTekst.find( szukanaFraza2, flaga + szukanaFraza2.size() );
       
    } while( flaga != std::string::npos );
   
    flaga = 0;
   
    do { // trzecia petla dla "[/b]
       
        flaga = sTekst.find( szukanaFraza3, flaga );
        sTekst.erase( flaga, szukanaFraza3.size() );
        sTekst.insert( flaga, zastapFraza3 );
        flaga = sTekst.find( szukanaFraza3, flaga + szukanaFraza3.size() );
       
    } while( flaga != std::string::npos );
   
   
   
    return sTekst;
}
int main()
{
    std::string tekst = "<b>to jest </b> testowy      napis      <b>:)";
    std::cout << konwertuj( tekst ) << std::endl;
    return 0;
}
P-144468
carlosmay
» 2016-02-04 23:55:21
Zastanawiałem sie troche
trochę za krótko.
moim zdaniem wszystko jest dobrze,
a jednak nie działa.

Swoją drogą nazwy zmiennych nieadekwatne do ich funkcji.
C/C++
size_t flaga = 0;
size_t flaga2 = 0;
Szukasz pozycji, więc może
C/C++
size_t pos = 0;
size_t pos2 = 0;
.

Z tą spacją mocno przekombinowane.
Jako szukaną frazę daj podwójną spację.
Jeśli taką znajdzie usuń znalezioną pozycję i szukaj od tego miejsca.
Jeżeli zostanie jedna spacja to jej nie znajdzie i przejdzie dalej przeszukiwać.
P-144477
baddevil96
Temat założony przez niniejszego użytkownika
» 2016-02-05 13:02:15
Dzieki za rady, lecz w programie dalej tkwił problem, jeśli liczba spacji była parzysta to program je usuwał bez pozostawienia odstępu, po małej modyfikacji doprowadziłem fragment kodu do takiej postaci, i w tym momencie chyba działa jak należy:

C/C++
std::string sWynik;
string szukanaFraza = " ";
string szukanaFraza2 = "<b>";
string szukanaFraza3 = "</b>"; //wyszukiwane frazy

string zastapFraza = " ";
string zastapFraza2 = "[b]";
string zastapFraza3 = "[/b]"; //frazy ktore maja zastapic te znalezione



size_t flaga = 0;
size_t flaga2 = 0;

do { // pierwsza petla dla " "
   
    flaga = sTekst.find( szukanaFraza, flaga );
    flaga2 = sTekst.find( szukanaFraza, flaga + 1 );
    if( flaga + 1 == flaga2 ) { // Warunek sprawiajacy ze program pomija miejsce w ktorym wystepuje jedna spacja
        do {
            sTekst.erase( flaga, szukanaFraza.size() );
            flaga2 = sTekst.find( szukanaFraza, flaga + 1 );
            flaga = sTekst.find( szukanaFraza, flaga );
        } while( flaga + 1 == flaga2 );
       
    }
    flaga = sTekst.find( szukanaFraza, flaga + 1 );
   
} while( flaga != std::string::npos );

P-144498
carlosmay
» 2016-02-05 16:15:34
Można też tak.
C/C++
size_t flaga = sTekst.find( szukanaFraza );
while( flaga != string::npos )
{
    if( sTekst[ flaga ] == sTekst[ flaga + 1 ] )
         sTekst.erase( flaga, szukanaFraza.size() );
    else
         flaga = sTekst.find( szukanaFraza, flaga + 1 );
   
}
P-144507
« 1 »
  Strona 1 z 1