C++ nie umiem za bardzo, ale w Pascalu zrobiłbym to tak:
function Censor(ASentence: String): String;
var
Letters: Integer = 0;
I: Integer;
begin
Result := '';
for I := 1 to ASentence.Length do
if ASentence[I] = ' ' then
begin
if Letters > 2 then Result += '-';
if Letters > 1 then Result += ASentence[I - 1];
Result += ' ';
Letters := 0;
end
else
begin
Letters += 1;
if Letters = 1 then
Result += ASentence[I];
end;
if Letters > 0 then
begin
if Letters > 2 then Result += '-';
if Letters > 1 then Result += ASentence[ASentence.Length];
end
end;
Już tłumaczę o co chodzi.
Zmienna Letters
to licznik następujących po sobie liter, zmienna I
zawiera indeks bieżącego znaku w wejściowym ciągu, którą inkrementuje główna pętla for
. Więcej pętli nie potrzeba, ale trzeba więcej warunków.
Pierwszy warunek sprawdza, czy bieżący znak to spacja i jeśli tak, wykonuje dwa dalsze warunki. Pierwszy z nich sprawdza, czy długość słowa jest większa niż dwa i jeśli tak to dopisuje do rezultatu znak minusa. Drugi sprawdza, czy słowo ma więcej niż jedną literę i jeśli tak, dopisuje do rezultatu ostatnią literę słowa. Następnie do rezultatu dodawany jest znak spacji (czyli bieżący względem iteratora), a licznik liter jest zerowany.
Po else
wykonywany jest kod, jeśli bieżącym znakiem jest litera (lub cokolwiek innego niż spacja). Najpierw zwiększamy licznik liter w słowie. Następnie sprawdzamy czy to pierwsza litera słowa i jeśli tak – dodajemy ją do ciągu wyjściowego.
Po pętli trzeba jeszcze sprawdzić, czy licznik liter jest większy niż 0
– to oznacza, że na końcu ciągu wejściowego jest słowo, które nie jest zakończone spacją, więc trzeba je zakończyć. Tu wykonuje się ten sam kod co w przypadku napotkania znaku spacji – jeśli trzeba to dodajemy znak minusa i jeśli słowo ma co najmniej dwie litery to dodajemy ostatnią literę do rezultatu.
No, powyższa propozycja działa prawidłowo z różnymi ciągami wejściowymi, więc możesz ten kod potraktować jako pseudokod i na jego podstawie napisać sobie odpowiednik w C++. Różnica polega na tym, że w Pascalu ciągi znaków indeksuje się od 1
(zaszłość historyczna), więc miej to na uwadze. ;)