Odczytywanie znaków
getchar i putchar
Odczytywanie znaków to bezpłatna lekcja C Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 4 lekcji w sumie.
Odczytywanie pojedynczych znaków
C udostępnia funkcję getchar() do odczytywania pojedynczych znaków ze standardowego wejścia oraz funkcję putchar() do zapisywania pojedynczych znaków na standardowym wyjściu.
Obie funkcje znajdują się w <stdio.h>.
#include <stdio.h>
int main(void) {
putchar('H');
putchar('i');
putchar('\n');
return 0;
}Podstawy putchar
putchar(c) zapisuje znak c i zwraca zapisany znak albo EOF w przypadku błędu.
To najprostszy sposób na wyprowadzenie pojedynczego bajtu.
#include <stdio.h>
int main(void) {
for (char c = 'A'; c <= 'E'; c++) {
putchar(c);
}
putchar('\n');
return 0;
}getchar zwraca int
getchar() zwraca wartość typu int, a nie char. Jest to ważne, ponieważ funkcja musi móc zwrócić EOF — wartość różną od każdego rzeczywistego znaku.
Wynik należy zawsze przechowywać w zmiennej typu int.
#include <stdio.h>
int main(void) {
int c = 'A';
printf("Stored value: %d\n", c);
return 0;
}Czym jest EOF
EOF oznacza koniec pliku (End Of File). getchar() zwraca tę wartość, gdy nie ma już więcej danych wejściowych.
Zwykle jest to wartość -1, dlatego getchar używa typu int, aby nie pomylić jej z bajtem 255.
#include <stdio.h>
int main(void) {
printf("EOF has value %d\n", EOF);
return 0;
}Schemat pętli odczytu
Klasyczny schemat odczytuje znaki aż do napotkania EOF. Ponieważ w tym miejscu nie ma interaktywnego wejścia, pętla kończy się natychmiast, ale właśnie tak wygląda standardowy schemat.
- Przypisanie należy wykonać wewnątrz warunku.
- Należy porównać wynik z
EOF.
#include <stdio.h>
int main(void) {
int c;
while ((c = getchar()) != EOF) {
putchar(c);
}
printf("Reached end of input\n");
return 0;
}Liczenie znaków
Typowym zadaniem jest policzenie, ile znaków odczytano. Należy zwiększać licznik wewnątrz pętli odczytu.
#include <stdio.h>
int main(void) {
int c;
long count = 0;
while ((c = getchar()) != EOF) {
count++;
}
printf("Read %ld characters\n", count);
return 0;
}Echo wielkimi literami
Każdy znak można przekształcić przed jego zapisaniem. W tym przykładzie każdy odczytany znak jest zamieniany na wielką literę za pomocą toupper.
#include <stdio.h>
#include <ctype.h>
int main(void) {
int c;
while ((c = getchar()) != EOF) {
putchar(toupper(c));
}
return 0;
}Liczenie wierszy
Policzenie znaków nowej linii pozwala określić, ile wierszy odczytano. Należy porównać każdy znak z '\n'.
#include <stdio.h>
int main(void) {
int c;
int lines = 0;
while ((c = getchar()) != EOF) {
if (c == '\n') lines++;
}
printf("Lines: %d\n", lines);
return 0;
}Cofanie znaku
ungetc(c, stdin) wstawia jeden znak z powrotem do strumienia wejściowego, dzięki czemu następny odczyt zwróci go ponownie.
Jest to przydatne, gdy podczas skanowania odczytano o jeden znak za dużo.
#include <stdio.h>
int main(void) {
ungetc('X', stdin);
int c = getchar();
printf("Got back: %c\n", c);
return 0;
}getchar a scanf
getchar zapewnia precyzyjną kontrolę na poziomie bajtów, natomiast scanf analizuje sformatowane dane wejściowe.
Do przetwarzania znak po znaku, na przykład w filtrach i tokenizerach, właściwym narzędziem jest getchar.
#include <stdio.h>
int main(void) {
int c = '5';
if (c >= '0' && c <= '9') {
printf("It is a digit: %c\n", c);
}
return 0;
}Prosty szkielet filtra
Filtry odczytują dane wejściowe, przekształcają je i zapisują na wyjściu. Ten szkielet usuwa wszystkie spacje ze strumienia wejściowego.
#include <stdio.h>
int main(void) {
int c;
while ((c = getchar()) != EOF) {
if (c != ' ') {
putchar(c);
}
}
return 0;
}Szybkie sprawdzenie
Sprawdź, jak dobrze rozumiesz odczytywanie znaków.
Podsumowanie
Nauczył się Pan odczytywać i zapisywać znaki:
getchar()odczytuje jeden znak i zwraca wartość typuint.putchar(c)zapisuje jeden znak.EOFsygnalizuje koniec danych wejściowych; należy używać pętliwhile ((c = getchar()) != EOF).ungetcmoże wstawić znak z powrotem do strumienia.
Często zadawane pytania
Czy lekcja „Odczytywanie znaków” jest bezpłatna?
Tak — pełny tekst „Odczytywanie znaków” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Odczytywanie znaków”?
getchar i putchar Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C Academy?
Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Odczytywanie znaków”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?
Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.