Problem ze zrozumieniem funkcji getchar w petli

0

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:

ascii7.jpg

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.

0

Nic nie zapamiętuje. getchar pobiera jeden znak, putchar wypisuje jeden znak.

Jeżeli masz problem ze zrozumieniem programu, to postaw sobie break'a w IDE i wykonuj kod linia po linii obserwując wartości i wszystkie zmiany.

0

Z całym szacunkiem, ale nie wiem dokładnie o co chodzi.
Chodzi o instrukcję break, która powoduje pominięcie reszty struktury w której się znajduje i przejście do pierwszej instrukcji następującej po tej strukturze?

0

np. https://msdn.microsoft.com/en-us/library/5557y8b4.aspx
(tutaj moje przejęzyczenie: chodziło mi o breakpoint)

0

Dobra, juz sam sobie doszedłem do tego, jak to działa, napisałem taki programik:


int main(void)
{

 int c;
    while((c=getchar()) != '|')
    {
        putchar(c);
        printf("\n");
    }
    
    printf("\nzmienna c = %c",c);
    return 0;
}

Wpisałem sobie ciąg znaków: abc|de
Po wyświetleniu wyniku oraz jego przeanalizowaniu i porównaniu tego programu z programem próbującym wczytać imię za pomocą samej funkcji getchar i putchar (bez pętli, czyli program w takim wypadku pobierze tylko pierwszą literę imienia i zakończy działanie) zrozumiałem w końcu, jak to wszystko działa.
I jeszcze jedna mała uwaga do spartanPAGE - następnym razem podawaj linki do artykułów w j. polskim, bo nie każdy początkujący programista musi znać angielski (chyba, że ów artykuł jest tylko po angielsku).
Temat można zamknąć, pozdrawiam.

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