Usuwanie zduplikowanych spacji z string

Usuwanie zduplikowanych spacji z string
0

Witam!
Na początku napisałem ten kod:

Kopiuj
 for (int i=0; i<sTekst.size(); i++)
    {

        if (!((sTekst[i] && sTekst[i-1]) == ' '))
        {
            cout<<sTekst[i];


        }

        else
        {
            i++;
        }


    } 

I nie działało. if zawsze był spełniony.

Natomiast to już mi zadziałało:

Kopiuj
    for (int i=0; i<sTekst.size(); i++)
    {

        if (!((sTekst[i] == ' ') && (sTekst[i-1] == ' ')))
        {
            cout<<sTekst[i];


        }

        else
        {
            i++;

        }


    }
	 

Zastanawiam się dlaczego. Oba kody praktycznie identyczne są. Zawsze trzeba tak rozdzielać? Zamiast

Kopiuj
if ((a & b) > c) 

muszę pisać:

Kopiuj
if ((a>c) && (b>c))

?

carlosmay
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Pabianice
2

Zastanawiam się dlaczego. Oba kody praktycznie identyczne są. Zawsze trzeba tak rozdzielać? Zamiast
if ((a & b) > c)

muszę pisać:
if ((a>c) && (b>c))

?

To nie jest to samo nawet praktycznie:

Kopiuj
if((a & b) > c) // tutaj dla a != 0 i b != 0 i c < 1 jest true
if((a > c) && (b > c)) // tutaj dla a > c i b > c jest true 

... poza tym rozumiesz różnicę między & a && w warunkach?

... a już na pewno nie to:

Kopiuj
if (!((sTekst[i] && sTekst[i-1]) == ' ')) // niezależnie od wyniku z nawiasu, ani true, ani false nie będą równe ' '
 if (!((sTekst[i] == ' ') && (sTekst[i-1] == ' '))) // natomiast tutaj porównanie jednej i drugiej zmiennej do ' ' ma szansę być true

Przykład:

Kopiuj
#include <iostream>
#include <string>
using namespace std;

auto main() -> int
{
	string myString{ "  h  a  l  l  o" };
	string findingSubstring{ "  " }; // podwójna spacja

	cout << myString << '\n';

	size_t pos = 0;
	while ((pos = myString.find(findingSubstring, pos)) != string::npos)
	{
		myString.erase(pos, 1);
	}

	cout << myString << '\n';
} 

edytowany 2x, ostatnio: carlosmay
carlosmay
Wcześniej mi umknęło: dla i = 0 wychodzisz poza zakres sTekst[i-1] == ' '.
0

Oczywiście wkradł się błąd. Chodziło mi o to, czy:

Kopiuj
if ((a && b) > c) 

i:

Kopiuj
if ((a>c) && (b>c))

to to smao

szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:4 dni
  • Lokalizacja:Kraków
  • Postów:1694
0

Nie to samo.
W 1 wynik a && b jest obliczany jako logiczny AND czyli przykładowo dla
a = 5 i b = 10 -> a && b == 1
a = 0 i b = 10 -> a && b == 0
W skrócie możesz to zapisać tak: if((a !=0 && b!= 0) > c)
wartość z nawiasu da Ci albo 0 albo 1 odpowiednio dla false i true Czyli jak widać nie ma za bardzo to sensu, chyba że za c przyjmiesz 0 wtedy sprawdzenie > odpowiadałoby czemuś w rodzaju == true
Podsumowując jeżeli przyjmiesz:
c > 0 zawsze otrzymasz false
c < 0 zawsze otrzymasz true.

W 2 ifie if ((a>c) && (b>c)) Masz logicznego ANDa ale tak, że najpierw sprawdzasz czy a > c -> jeśli tak to możesz nawias potraktować jako 1 w przeciwnym razie jako 0 a potem sprawdzasz b > c i robisz to samo. Jak wiadomo operacja AND zwraca 1 (czyli true) tylko dla 1 AND 1 więc zawartość ifa będzie true tylko gdy a > c i b > c. Warto wspomnieć też o
https://en.wikipedia.org/wiki/Short-circuit_evaluation czyli w przypadku AND jeżeli pierwsza wartość jest false to reszta nie jest sprawdzana i całość jest traktowana jako false a w przypadku OR przy wystąpieniu true całość jest traktowana jako true.

edytowany 2x, ostatnio: szweszwe
gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
2
Kopiuj
void EraseDuplSpace(string &s)
{
    while(s.find("  ", 0) != string::npos)
     s.replace(s.find("  ", 0), 2, " ");
} 

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.