• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Usuwanie wielokrotnych spacji C++

42 Warsaw Coding Academy
0 głosów
1,689 wizyt
pytanie zadane 4 maja 2018 w C i C++ przez Szymek_sw Początkujący (420 p.)

Napisałem kod jako odpowiedz na 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 <b> oraz </b> znacznikami [b] oraz [/b]. Tekst, który powstanie w wyniku przeprowadzenia wspomnianych operacji wypisz na ekran. Użyj metod find, erase  i insert.

//Microsoft Visual Studio
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

string konwertuj(string & sTekst)
{
	string sWynik;
	size_t szukajka2 = 0;
	while (true)
	{

		size_t szukajka = sTekst.find(" ",szukajka2);
		szukajka2 = sTekst.find(" ", szukajka + 1);
		if (szukajka2 == szukajka + 1)
		{
			sTekst.erase(szukajka, 2);
		}
		else if (szukajka2 == string::npos)
		{
			break;
		}
	}
	szukajka2 = 0;
	while (true)
	{
		size_t szukajka = sTekst.find("<b>", szukajka2);
		if (szukajka == string::npos)
		{
			break;
		}
		sTekst.erase(szukajka, 3);
		sTekst.insert(szukajka, "[b]");
		szukajka2 = szukajka;
	}

	szukajka2 = 0;
	while (true)
	{
		size_t szukajka = sTekst.find("</b>", szukajka2);
		if (szukajka == string::npos)
		{
			break;
		}
		sTekst.erase(szukajka, 3);
		sTekst.insert(szukajka, "[/b]");
		szukajka2 = szukajka;
	}
	sWynik = sTekst;
	return sWynik;
}
int main()
{
	string tekst = "<b>to jest </b> testowy       napis     <b>:)";
	cout << konwertuj(tekst) << endl;
	system("pause");
	return 0;
}

Ale czuje że jest kompletnie nie zoptymalizowany. Jeżeli się mylę proszę mnie poprawić, jeżeli nie, proszę o poprawę mojego kodu (najlepiej w postaci podpowiedzi do poprawy). Dzięki za odpowiedz! :3 

1 odpowiedź

+1 głos
odpowiedź 5 maja 2018 przez j23 Mędrzec (195,240 p.)
wybrane 5 maja 2018 przez Szymek_sw
 
Najlepsza

Tu masz przykład na optymalniejsze usuwanie wielokrotnie powtarzających się spacji:

    std::string s = "a   bc d ";
    
    char prev = 0;
    auto i1 = s.begin();
    auto i2 = i1;
    
    while(i2 != s.end())
    {
        if(*i2 == ' ' && prev == ' ') { prev = *i2++; } 
        else { prev = *i1++ = *i2++; }            
    }
    
    s.erase(i1, s.end());
    
    std::cout << s << '\n';

 

  while (true)
    {
        size_t szukajka = sTekst.find("<b>", szukajka2);
        if (szukajka == string::npos)
        {
            break;
        }
        sTekst.erase(szukajka, 3);
        sTekst.insert(szukajka, "[b]");
        szukajka2 = szukajka;
    }

Zamiast erase i insert, zamień po prostu znaki `<` i `>` odpowiednio na `[` i `]`. Użyj operatora indeksowania.

To while(true) nieładnie wygląda, szczególnie, że możesz to zapisać tak:

size_t szukajka;
 
while ((szukajka = sTekst.find("<b>", szukajka2)) != string::npos) 
{ 
      ...
}

 

komentarz 5 maja 2018 przez Szymek_sw Początkujący (420 p.)
Wielkie dzięki!

Podobne pytania

0 głosów
2 odpowiedzi 1,231 wizyt
pytanie zadane 9 stycznia 2018 w C i C++ przez mn130496 Gaduła (3,530 p.)
0 głosów
1 odpowiedź 632 wizyt
pytanie zadane 13 grudnia 2016 w C i C++ przez Kamyyylo Początkujący (460 p.)
0 głosów
1 odpowiedź 1,084 wizyt
pytanie zadane 7 maja 2017 w HTML i CSS przez Cemini Nowicjusz (170 p.)

93,398 zapytań

142,390 odpowiedzi

322,580 komentarzy

62,759 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...