Witam. Przerabiając ksiażkę "Język C - szkoła programowania" S. Praty, dotarłem do rozdziału 7 dotyczącego instrukcji sterujacych. W jednym z podrozdziałów jest pokozane zastosowanie funkcji getchar oraz putchar, ktorej nie rozumiem.
Jest pokazany nastepujacy kod:
int main(void)
{
char ODSTEP = ' ';
char ch;
while((ch = getchar()) != '\n') //odczytywanie znaku, dopoki nie ma konca wiersza
{
if (ch == ODSTEP) //pozostaw znak spacji bez zmian
putchar(ch);
else
putchar(ch+1); //zmien pozostale znaki
}
putchar(ch); //wyswietl znak nowej linii
return 0;
}
Jest to program wykorzystujący funkcję getchar do pobierania znakow. Ma on pobierac znaki z klawiatury tak dlugo, dopóki nie zostanie naciśnięty klawisz enter. Po naciśnięciu klawisza enter wszystkie znaki zostana zastapione kolejnym znakiem w kodzie ASCII, nie liczac odstepow. Przykladowe dzialanie programu:
Problem polega na tym, że nie rozumiem, na jakiej zasadzie funkcja getchar zapamiatuje w pamieci komputera wszystkie wpisane znaki, skoro mamy do dyspozycji tylko jedna zmienna ch. Jak zrobiłem program proszący o podanie imienia uzytkownika za pomoca getchar(), to po wpisaniu imienia program wypisywał tylko pierwsza litere. W powyższym kodzie mamy co prawda pętle, która ma byc wykonywana (czyli ma pobierać kolejne znaki), dopóki zmiennej ch nie zostanie przypisany znak nowej linii (czyli naciśnięcie klawisza enter), ale gdzie komputer zapamiętuje poprzednio wpisane znaki? Przeciez zmienna ch to jest pojedyncza zmienna, a nie tablica, która w każdej "szufladce" przechowuje poszczególne znaki, które są częścią jakiegoś łańcucha + specjalny znak 0, który kończy łańcuch.
I dlaczego zmienione znaki są wyświetlane dopiero po zakończeniu pętli, skoro funkcja putchar po petli wyświetla jedynie znak nowej linii. Równie dobrze można ją usunąć, a program będzie dalej działał poprawnie.
Może mi ktoś to jakoś łopatologicznie wytłumaczyć, żebym zrozumiał na jakiej zasadzie w tym programie działają funkcje getchar i putchar. Do tej pory rozumiałem wszystkie zagadnienia z książki + cały rozdział 7, który już przerobiłem, ale nie chcę iść dalej dopóki w pełni nie zrozumiem wymienionych przeze mnie funkcji.