Ce face getchar
getchar() citește următorul caracter din stdin și îl returnează ca int. Când nu mai sunt date (sfârșit de fișier, sau Ctrl+D în terminal pe Linux și macOS, Ctrl+Z pe Windows), returnează constanta EOF (de obicei -1).
De aceea rezultatul se păstrează într-un int, nu într-un char: EOF trebuie să se deosebească de orice caracter valid. fgetc(f) și getc(f) fac același lucru pentru un fișier oarecare.
Tastatura este citită pe rânduri: programul primește caracterele abia după Enter, iar Enter-ul ajunge și el, ca '\n'. getchar citește octeți, deci o literă cu diacritice în UTF-8 (de exemplu „ă”) vine ca doi octeți.
Ce returnează
Caracterul citit, ca unsigned char convertit la int, sau EOF la sfârșitul intrării sau la eroare.
Exemple
Exemplul 1: Numărarea literelor, cifrelor și rândurilor
Bucla clasică while ((c = getchar()) != EOF) citește toată intrarea caracter cu caracter. Parantezele din jurul atribuirii sunt obligatorii.
#include <ctype.h>
#include <stdio.h>
int main(void) {
int c, litere = 0, cifre = 0, randuri = 0;
while ((c = getchar()) != EOF) {
if (isalpha(c)) litere++;
else if (isdigit(c)) cifre++;
else if (c == '\n') randuri++;
}
printf("Litere: %d, cifre: %d, rânduri: %d\n", litere, cifre, randuri);
return 0;
}
Ce scrie utilizatorul (intrare)
Ana are 3 mere
si 12 pere
Rezultat
Litere: 16, cifre: 3, rânduri: 2
Exemplul 2: Un răspuns d/n
Programul ia doar primul caracter al răspunsului. Restul rândului (inclusiv Enter-ul) este „consumat” de bucla de după, ca să nu încurce următoarea citire.
#include <stdio.h>
int main(void) {
printf("Trimit comanda? (d/n): ");
int raspuns = getchar();
int c;
while ((c = getchar()) != '\n' && c != EOF) {
// ignorăm restul rândului
}
if (raspuns == 'd' || raspuns == 'D') {
printf("\nComanda a fost trimisă.\n");
} else {
printf("\nComanda a fost anulată.\n");
}
return 0;
}
Ce scrie utilizatorul (intrare)
da
Rezultat
Trimit comanda? (d/n):
Comanda a fost trimisă.
Greșeli frecvente
- Păstrezi rezultatul într-un
char:char c = getchar();. Pe sistemele undechareste fără semn,c != EOFe mereu adevărat și bucla nu se mai termină; unde e cu semn, un octet 255 este luat dreptEOF. Foloseșteint. - Scrii
while (c = getchar() != EOF)fără paranteze. Comparația se face prima, iarcprimește 0 sau 1, nu caracterul. - Uiți că Enter-ul ajunge și el în intrare ca
'\n'și îl primești la următorulgetchar().
Comenzi înrudite
puts și putchar: puts afișează un șir și trece la rând nou, putchar afișează un singur caracter; mai simple decât printf când nu formatezi nimic.fgets: Citește un rând întreg (cu tot cu spații) într-un tablou de caractere, fără să depășească dimensiunea dată.scanf: Citește valori de la tastatură după un șablon (%d, %lf, %s) și le scrie la adresele primite; returnează câte valori a citit.ctype.h (isdigit, isalpha, toupper...): Funcții care verifică ce fel de caracter ai (cifră, literă, spațiu) și care schimbă literele mari în mici și invers.while și do-while: Repetă un bloc cât timp o condiție este adevărată; do-while rulează blocul cel puțin o dată, apoi verifică.