getchar în C

Citește un singur caracter de la intrarea standard; returnează EOF când intrarea s-a terminat.

Sintaxă
#include <stdio.h>
int getchar(void);
int fgetc(FILE *stream);

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 unde char este fără semn, c != EOF e mereu adevărat și bucla nu se mai termină; unde e cu semn, un octet 255 este luat drept EOF. Folosește int.
  • Scrii while (c = getchar() != EOF) fără paranteze. Comparația se face prima, iar c primește 0 sau 1, nu caracterul.
  • Uiți că Enter-ul ajunge și el în intrare ca '\n' și îl primești la următorul getchar().

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ă.