Podstawy C - getchar() i putchar() oraz wartość stałej symbolicznej EOF

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
Heron
Wytworny Kaczor
Wytworny Kaczor
Posty: 258
Rejestracja: 10 cze 2010, 00:29
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: Unity
Architektura: x86_64

Podstawy C - getchar() i putchar() oraz wartość stałej symbolicznej EOF

Post autor: Heron »

Witam, rozpocząłem naukę języka C wraz z książką "Język ANSI C" Autor: Ritchie & Kerningham. Obecnie czytam na temat "Wejście i wyjście znakowe" i nie mogę zrozumieć zasady działania funkcji getchar() i putchar(). Niby są to funkcje operujące na łańcuchach znakowych czyli zmiennej typu char. W książce zaprezentowano programu jak poniżej:

Kod: Zaznacz cały

#include <stdio.h>

int main()
{
      int c;
      c=getchar();
      while(c != EOF) {
          putchar(c);
          c=getchar();
      }
      return 0;
}
Teraz dlaczego zmienną c autor użył jako typu int a nie char ? Po drugie mógłby mi ktoś wytłumaczyć tak szczegółowo zastosowanie i działanie funkcji getchar() oraz putchar() ? Czym jest ta zmienna EOF i jak ona działa, wiem że jest to koniec pliku czyli end of file. Ale rozumiem też że podając zmienną EOF program powinien zakończyć działanie. Jak wartość przechowuje EOF ? Po uruchomieniu programu mogę wpisać np. 'bla bla bla' i konsola wyświetli mi bla bla bla, ale wpisując nic program nie zakańcza działania, tak więc nie wiem czym jest ten 'EOF', ktoś wytłumaczy ? Mam na koniec dwa zadania, pierwsze z nich brzmi: Sprawdź, że wyrażenie getchar() != EOF może mieć wartość 0 lub 1. Nie wiem jak wykonać to zadanie. Następne to: Napisz program wypisujący wartość stałej symbolicznej EOF. I tutaj napisałem coś takiego:

Kod: Zaznacz cały

#include <stdio.h>

int main()
{
       printf(EOF);
       return 0;
}
Problem w tym, że program nie wyświetla nic, nie ma błędu żadnego ale na konsoli nie pojawia się żaden znak. Jeśli EOF to pusty znak czy coś, to wciskając enter w pierwszym programie powinien on zakończyć swoje działania ponieważ

Kod: Zaznacz cały

c != EOF
a program nigdy nie kończy swojego działania (ten z pierwszego kodu). Ktoś coś napisze na ten temat tutaj - czyli getchar(), putchar() oraz EOF ?
Awatar użytkownika
nithathak
Wytworny Kaczor
Wytworny Kaczor
Posty: 330
Rejestracja: 07 kwie 2007, 19:29
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: Podstawy C - getchar() i putchar() oraz wartość stałej symbolicznej EOF

Post autor: nithathak »

Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Podstawy C - getchar() i putchar() oraz wartość stałej symbolicznej EOF

Post autor: dawwin »

Wartość stałej EOF sprawdzisz tak:

Kod: Zaznacz cały

printf("%d\n", EOF);
Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
Awatar użytkownika
Heron
Wytworny Kaczor
Wytworny Kaczor
Posty: 258
Rejestracja: 10 cze 2010, 00:29
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: Unity
Architektura: x86_64

Odp: Podstawy C - getchar() i putchar() oraz wartość stałej symbolicznej EOF

Post autor: Heron »

No dobra, teraz w takim razie pokazuje mi wartość -1. Ale jeśli chodzi o kod programu kopiowania znaków i wyświetlania ich, jest w kodzie taki fragment

Kod: Zaznacz cały

while(c != EOF){}
co znaczy według mnie, że jeśli podam wartość EOF to wyjdę z pętli while i zakończę działanie programu. Wpisując jakikolwiek tekst wyświetla mi ten tekst ponownie na ekranie monitora. Wpisując -1 nie wychodzi z programu tylko nadal wypisuje -1 na ekranie. Czym jest ten warunek

Kod: Zaznacz cały

c != EOF
w while skoro i tak nie spełnia to swojej roli. Nie rozumiem tego :/
Awatar użytkownika
Hauleth
Wytworny Kaczor
Wytworny Kaczor
Posty: 382
Rejestracja: 18 sie 2008, 17:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86

Odp: Podstawy C - getchar() i putchar() oraz wartość stałej symbolicznej EOF

Post autor: Hauleth »

Wartość EOF w konsoli się podaje poprzez Ctrl+D a nie podawanie jej wartości liczbowej z kodu C/C++.
Jeśli problem rozwiązany dodaj na początku tematu [SOLVED].

Biblioteka do C++ - Bust Lib: http://code.google.com/p/bust/
Awatar użytkownika
Heron
Wytworny Kaczor
Wytworny Kaczor
Posty: 258
Rejestracja: 10 cze 2010, 00:29
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: Unity
Architektura: x86_64

Odp: Podstawy C - getchar() i putchar() oraz wartość stałej symbolicznej EOF

Post autor: Heron »

A jak to podać w konsoli w środowisku Eclipse Galileo ?
otokan
Sędziwy Jeż
Sędziwy Jeż
Posty: 65
Rejestracja: 11 gru 2008, 11:20
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: Podstawy C - getchar() i putchar() oraz wartość stałej symbolicznej EOF

Post autor: otokan »

Heron pisze:No dobra, teraz w takim razie pokazuje mi wartość -1. Ale jeśli chodzi o kod programu kopiowania znaków i wyświetlania ich, jest w kodzie taki fragment

Kod: Zaznacz cały

while(c != EOF){}
co znaczy według mnie, że jeśli podam wartość EOF to wyjdę z pętli while i zakończę działanie programu. Wpisując jakikolwiek tekst wyświetla mi ten tekst ponownie na ekranie monitora. Wpisując -1 nie wychodzi z programu tylko nadal wypisuje -1 na ekranie. Czym jest ten warunek

Kod: Zaznacz cały

c != EOF
w while skoro i tak nie spełnia to swojej roli. Nie rozumiem tego :/
Funkcja getchar wczytuje następny znak (bajt, liczbę 0-255) z wejścia i zwraca jego wartość.
Po wczytaniu ostatniego znaku każde kolejne wywołanie funkcji zwraca EOF (-1).
EOF nie jest nigdy częścią wejścia. Nie możesz go napisać. Jak podasz -1 to getchar zwróci '-' i '1' przy kolejnych wywołaniach.
oko3
Piegowaty Guziec
Piegowaty Guziec
Posty: 3
Rejestracja: 10 mar 2011, 23:16
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: Podstawy C - getchar() i putchar() oraz wartość stałej symbolicznej EOF

Post autor: oko3 »

Witam, ja z kolei mam takie pytanie: dlaczego gdy zamiast EOF w while'u w pierwszym kodzie programu wstawiam dowolną wartość (np. c != 2) to program działa tak jakby nic się nie zmieniło i gdy wprowadzam 2 to wyświetla mi 2. Czy w takim przypadku pętla nie powinna się przerwać a program zakończyć działanie?
kobylecki
Piegowaty Guziec
Piegowaty Guziec
Posty: 19
Rejestracja: 05 gru 2005, 18:11
Płeć: Mężczyzna
Wersja Ubuntu: 11.10
Środowisko graficzne: Unity
Architektura: x86

Odp: Podstawy C - getchar() i putchar() oraz wartość stałej symbolicznej EOF

Post autor: kobylecki »

gdy wpisujesz '2', a funkcja wczytuje ten znak '2' o wartości (numerze) 50
http://pl.wikipedia.org/wiki/ASCII
Zatem w warunku pętli sprawdzasz czy '2' != 2, czyli 50 != 2.

Wartość dwa to w kodzie ASCII start of text
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 15 gości