Usuwanie zduplikowanych spacji z string

0

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

 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:

    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

if ((a & b) > c) 

muszę pisać:

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

?

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:

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:

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:

#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';
} 
0

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

if ((a && b) > c) 

i:

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

to to smao

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.

2
void EraseDuplSpace(string &s)
{
    while(s.find("  ", 0) != string::npos)
     s.replace(s.find("  ", 0), 2, " ");
} 

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