K&R ANSI C: Rozwiązanie ćwiczenia 3.3

Ostatnio kupiłem książkę Język C Programowanie. Brian W. Kernighan oraz Dennis M. Ritchie. Jest naprawdę super, książka wymaga osobnej recencji w osobnym poście.

Książka posiada w sobie ćwiczenia i oto publikuje jedno z nich.

Ćwiczenie 3.3 Napisz funkcję expand(s1,s2), która odczytuje skrócony  zapis typu a-z w ciągu s1 i zapisuje w ciągu s2. jego odpowiednik abc…xyz. Zadbaj o obsługę dużych i małych liter oraz cyfr. Zwróć uwagę na obsługę takich ciągów jak a-b-c, a-z0-9. Znak 0 na początku lub na końcu ciągu powinien być interpretowany jako zwykły znak a nie jako część skrótu.

Podczas pisania doszedłem do takich wniosków

Wnioski: Nieważne jak funkcja wygląda podczas tworzenia, najpierw rozwiązanie problemu potem poprawianie wydajności oraz wygląd wizualny.

void expand(char *range, char output[])
{
int i = 0;
char start,end;
while(*range != '') //Koniec stringu
{
if(*(range+1) == '-'){
output[i++]=*range;
start=*range++; //przechwytanie początku zakresu
}
else{
output[i++]=*range++; //Wpisywanie danych które sa swobodne
}
if(*range=='-') {
end = *(range+1);
if(start > end)
while(--start >= end)
output[i++]=start;
else
while(++start <= end)
output[i++]=start;
start=end;
range +=2; //Przeskok przez - i znak konca zakresu
}
}
output[i]=''; //Zakonczenie stringu
}

Edycja: Dodana funkcja obsługi zakresów o odwróconej kolejności np. z-a -> zyx..cba
Edycja 2: Funkcja nie sprawdza błędnie wprowadzonego ciągu. typu -1-4 powinno być —1-4
Edycja 3(27-04-2011): Naprawiłem błąd z wyrazami niebędącymi w ciągu(tzw. swobodne).