Funkcja odwracająca string - wyjaśnienie

0

Witam Szanowne Forum,

dziś zostało postawione przede mną zadanie napisania funkcji odwracającej string. Znalazłem pożądane rozwiązanie, ale... poprzeczka okazała się dosyć wysoka.
Mógłby mi ktoś chociaż wyjaśnić działanie tej funkcji?

void r(char* str)
{
	char*q = str;
	for (; (++q)[-1];);
	
	q -= 2;

	for (; q>str; *str++ ^= *q--)
	{
		*str ^= *q;
		*q ^= *str;
	}
}

Z góry wielkie dzięki.

3
for (; (++q)[-1];);

Powyższa pętla przesuwa q za koniec łańcucha. Koniec łańucha jest bajtem o wartości zero, a więc jest interpretowany jako false w warunku pętli.

    for (; q>str; *str++ ^= *q--)
    {
        *str ^= *q;
        *q ^= *str;
    }

Tutaj następuje zamiana znaków pod wskaźnikami q i str, następnie przesunięcie tych wskaźników ku sobie i kontynuacja pętli dopóki wskaźniki się nie miną. Do zamiany wartości pod wskaźnikami autor użył dość bezsensownej konstrukcji opisanej tutaj: https://graphics.stanford.edu/~seander/bithacks.html#SwappingValuesXOR

Polecam olać całą tę funkcję i napisać coś własnego od zera.

0

Dziękuję Panie Wibowit. Rzeczywiście poczułem się jakbym nic nie wiedział o programowaniu czytając to rozwiązanie. Przeszło mi przez głowę, żeby rozbić string na tablicę poszczególnych znaków i wykonać na tej tablicy resztę operacji. Ma to jakiś sens?
Jeśli tak, to podpowiedzcie mi proszę, jak mogę dobrać się do poszczególnej litery zmiennej char. W sensie jak sprawdzić jaka litera zajmuje kolejne miejsce w zmiennej char i wpisać ją do tablicy?

1

Nie trzeba nic zamieniać na tablicę znaków, bo char* str już jest tablicą znaków, z tym że jej długość zamiast być podana wprost jest obliczana jako indeks pierwszego (i jedynego) elementu o wartości 0 (nie znaku '0', bo ten w kodzie ASCII ma wartość 48 - można to sprawdzić np na https://www.asciitable.com/ ).

0

Zaskakująco dużo to wyjaśnia. Dzięki raz jeszcze.

0

Na studia się nie nada, bo prowadzący najpewniej chce żebyś wymyśli/zaimplementował jakiś algorytm. Dla każdego innego zastosowania

std::string str = "input";
std::reverse(str.begin(), str.end());
0

Dzięki za podpowiedź. Właśnie nawet nie chodzi o studia, tylko dostałem takie zadanie przy rozmowie o pracę. I tak jak zakładałeś takie rozwiązanie nie wchodziło w grę. Tak dla własnej satysfakcji chciałem znaleźć odpowiedź sam. Ale przyznaję, że nie wiem sam jak się za to zabrać.

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