Problem z modyfikacją tekstu

Odpowiedz Nowy wątek
2019-04-19 17:32
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.

#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, 2019-04-19 17:34

Pozostało 580 znaków

2019-04-20 12:16
0

Ma ktoś jakiś pomysł ?

Pozostało 580 znaków

2019-04-20 13:05

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:

#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.


(っ◔◡◔)っ ♥ Kto produkcji nie wy♥bie ten nie zazna szczęścia w niebie ♥
edytowany 2x, ostatnio: Sunnydev, 2019-04-20 13:07
i zapewne zadziałają wydajniej, niż próba implementowania tego we własnej funkcji. - Tenonymous 2019-04-20 13:19

Pozostało 580 znaków

2019-04-20 13:30
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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