Operacje na stringach

0

Witam znalazłem kolejne zadanie z cpp0x ale tym razem nie mam pojęcia jak je zrobić... Nie mam pomysłu do warunku pętli która musi być...
Wklejam kod poniżej:

#include <iostream>
#include <string>

using namespace std;

string konwertuj( string sTekst )
{
    string sWynik;
    while()
    {
        int szukaj=sTekst.find("<b>");
        if(szukaj !=string::npos)
        {
            sTekst.erase(szukaj,3);
            sTekst.insert(szukaj,"[b]");
        }
        int szukaj1=sTekst.find("</b>");
        if(szukaj1 !=string::npos)
        {
            sTekst.erase(szukaj1,4);
            sTekst.insert(szukaj1,"[/b]");
        }
        int szukajS=sTekst.find("  ");
        if(szukajS  !=string::npos)
        {
            sTekst.erase(szukajS,1);
        }
    }
    sWynik=sTekst;
    return sWynik;
}
int main()
{
    cout << konwertuj( "<b>to jest </b> testowy       napis     <b>:)" ) << endl;
    cout << konwertuj( "  s       a         m      e         sp    a   c j    e" ) << endl;
    cout << konwertuj( "<<B><//b><i></i>" ) << endl;
    return 0;
}

Program ma za zadanie zamienić dane frazy aż do wyczerpania a w ostatnim z dwóch spacji zrobić jedną... Tylko jak to zasugerować w pętli? Chyba że ktoś wie jak to zrobić inaczej/lepiej.

0

Wklej zadanie ze strony, nie rozumiem co ten program ma robić czytając to co napisałeś

0

Link
Masz link zadanie jest na samym dole.

0

Niedawno pojawił się na forum wątek z tym samym zadaniem: o tu popatrz sobie na rozwiązania. Zainteresuj się też STL-em, a szybko zauważysz, że za żadne skarby nie będziesz chciał wrócić do pisania w stylu C :)

0

Ok po małych zmianach wygląda to tak

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

string konwertuj( string sTekst )
{
    string sWynik;
    replace(sTekst.begin(), sTekst.end(), '<b>','[b]');
    replace(sTekst.begin(), sTekst.end(), '</br>', '[/b]');
    unique_copy(sTekst.begin(), sTekst.end(), back_inserter(sWynik), [](char c1, char c2){return c1== ' '&& c2==' ';});
    return sWynik;
}
int main()
{
    cout << konwertuj( "<b>to jest </b> testowy       napis     <b>:)" ) << endl;
    cout << konwertuj( "  s       a         m      e         sp    a   c j    e" ) << endl;
    cout << konwertuj( "<<B><//b><i></i>" ) << endl;
    return 0;
}

Ale wydaje mi się a raczej jestem tego pewien że raplace działa na pojedyńcze a nie na określone frazy:/ Da się jakoś to zmienić? @Sunnydev?

0

@TenAnonim: Tak, std::replace zamienia Ci pojedyncze znaki, ale nie tylko: std::replace.
Takie rozwiązanie jest po prostu najszybsze, bo oczywiście - są inne sposoby, chociażby coś w stylu

jakis_string.replace(odkąd, dokąd, "ciąg znaków");

tylko, że to więcej roboty i potencjalne błędy, a z resztą to nie dałoby sobie rady z jakimiś ciągami podobnymi do tego w 19 linijce :P

0

Ok zrobiłem... Ale nie wiem jakim cudem to działa...
Edit. Po dopisaniu jakiegokolwiek b juz nie dziala... Ech niech to...

#include <iostream>
#include <string>
#include <algorithm>


using namespace std;

string konwertuj( string sTekst )
{
    string sWynik;
    int dl=sTekst.length();
    for(int i=0; i<dl; i++)
    {
        int szukaj=sTekst.find("<b>");
        if(szukaj>=0)
        {
            sTekst.replace(szukaj, szukaj+3, "[b]");
        }
        szukaj=0;
        int szukajb=sTekst.find("</b>");
        if(szukajb>=0)
        {
            sTekst.replace(szukajb, szukajb+4, "[/b]");
        }
        szukajb=0;
    }
    //replace(sTekst.begin(), sTekst.end(), '</br>', '[/b]');
    unique_copy(sTekst.begin(), sTekst.end(), back_inserter(sWynik), [](char c1, char c2){return c1== ' '&& c2==' ';});
    return sWynik;
}
int main()
{
    cout << konwertuj( "<b>to jest </b> testowy       napis     <b>:)" ) << endl;
    cout << konwertuj( "  s       a         m      e         sp    a   c j    e" ) << endl;
    cout << konwertuj( "<<B><//b><i></i>" ) << endl;
    return 0;
}

@Sunnydev Czy to ma rację bytu?

0

No i gitara XD ale pozostaje pytanie co z tym: "<<B><//b><i></i>"? :)

0

To na dole zmieniane być nie ma, haczyk tkwił właśnie w tym żeby zmieniać te kawałki a nie same strzałki < >;) Bo gdyby same strzałki to proste zrobiłem to na początku dopiero potem się zorientowałem że nie tak.

1 użytkowników online, w tym zalogowanych: 0, gości: 1