Problem z modyfikacją tekstu

Problem z modyfikacją tekstu
BA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:52
0

Do napisania mam takie zadanie.
Napisz program, który z podanego łańcucha znaków usunie powtarzające się spacje występujące obok siebie i zastąpi wszystkie znaczniki oraz znacznikami [b] oraz [/b]. Tekst, który powstanie w wyniku przeprowadzenia wspomnianych operacji wypisz na ekran.

Kopiuj
#include <iostream>
#include <string>

using namespace std;

void konwertuj( string sTekst )
{
    //string sWynik;
    int pozSpac,poz1,poz2;
    pozSpac=sTekst.find(' ');
    while(pozSpac!=string::npos){
        while(sTekst[pozSpac+1] ==' '){
            sTekst.erase(pozSpac,1);
        }
        pozSpac=sTekst.find(' ',pozSpac+1);
    }
    poz1=sTekst.find('<');
    poz2=sTekst.find('>');
    while(poz1 != string::npos && poz2 != string::npos){
        sTekst.erase(poz1, 1);
        sTekst.insert(poz1, "[");
        sTekst.erase(poz2, 1);
        sTekst.insert(poz2, "]");
        poz1 = sTekst.find('<', poz1 + 1);
        poz2 = sTekst.find('>', poz2 + 1);
    }
    cout << sTekst << endl;
}
int main()
{
    string str1="<b>to jest </b> testowy       napis     <b>:)";
    string str2="  s       a         m      e         sp    a   c j    e";
    string str3="<<B><//b><i></i>";
    konwertuj(str1);
    konwertuj(str2);
    konwertuj(str3);
    return 0;
}

wychodzi:

" [b]to jest [/b] testowy napis [b]:) "
" s a m e sp a c j e "
" [[B][//b][i]</i] "

Powinno wyjść:

" [b]to jest [/b] testowy napis [b]:) "
" s a m e sp a c j e "
" [[B][//b][i][/i] "

W 3 zmiennej mi nie zmienia, zamiast [/i] mam </i]

edytowany 2x, ostatnio: basted
BA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:52
0

Ma ktoś jakiś pomysł ?

Sunnydev
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Nether
  • Postów:235
2

Może to średnia pomoc, bo nie wpadłem dlaczego nie usuwa Ci tego jednego znaku (podejrzewałem, że pętla robi o jedną iterację za mało - bez sensu), ale jest szybszy i łatwiejszy sposób na zamianę znaków w stringu:

Kopiuj
#include <algorithm>
std::replace(sTekst.begin(), sTekst.end(), '>', ']');
std::replace(sTekst.begin(), sTekst.end(), '<', '[');

Obydwie linijki przelatują po całym stringu i szukają > i < zamieniając je na ] i [, a z dziesięciu linijek zrobiły się dwie, które są o wiele czytelniejsze.


lubię tylko w c++ i w rust i w go i w haskell. pythona nie lubię, javy też. c# toleruję.
edytowany 2x, ostatnio: Sunnydev
Tenonymous
i zapewne zadziałają wydajniej, niż próba implementowania tego we własnej funkcji.
tajny_agent
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad rok
  • Postów:1340
1

Do usuwania powtarzających się znaków możesz użyć std::unique_copy z <algorithm>. Nawet jest gotowy przykład dla spacji na cppreference


"I love C++. It's the best language in the world right now for me to write the code that i need and want to write"
~ Herb Sutter

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.