std::scanf în C++

Citește valori formatate de la tastatură în stil C, primind adresele variabilelor.

Sintaxă
#include <cstdio>
int scanf(const char* format, ...);

Ce face std::scanf

scanf este perechea de citire a lui printf. Primește un șablon cu marcaje (%d, %lf pentru double, %s pentru un cuvânt) și adresele variabilelor, cu &: scanf("%d", &x).

Returnează câte valori a citit cu succes. Compară rezultatul cu numărul așteptat ca să afli dacă intrarea a fost corectă. Textul din șablon care nu e marcaj trebuie să apară exact în intrare: "%d.%d.%d" citește o dată de forma 19.10.2026.

Este mai rapid decât std::cin în configurația implicită și apare des în programele de concurs, dar este mai ușor de folosit greșit.

Parametri

Parametru Descriere
format Șablonul cu marcaje.
... Adresele variabilelor (&x); pentru tablouri char, numele tabloului.

Ce returnează

Numărul de valori citite cu succes, sau EOF dacă intrarea s-a terminat înainte de prima valoare.

Exemple

Exemplul 1: Citirea unei date

#include <cstdio>

int main() {
    int zi, luna, an;
    if (std::scanf("%d.%d.%d", &zi, &luna, &an) == 3) {
        std::printf("Ziua %d, luna %d, anul %d\n", zi, luna, an);
    } else {
        std::printf("Format greșit\n");
    }
}

Ce scrie utilizatorul (intrare)

19.10.2026

Rezultat

Ziua 19, luna 10, anul 2026

Exemplul 2: Nume, vârstă și medie

%19s citește un cuvânt de cel mult 19 caractere (plus '\0' în tabloul de 20); %lf este marcajul de citire pentru double.

#include <cstdio>

int main() {
    char nume[20];
    int varsta;
    double medie;
    int citite = std::scanf("%19s %d %lf", nume, &varsta, &medie);
    std::printf("Valori citite: %d\n", citite);
    std::printf("%s, %d ani, media %.2f\n", nume, varsta, medie);
}

Ce scrie utilizatorul (intrare)

Ana 21 9.45

Rezultat

Valori citite: 3
Ana, 21 ani, media 9.45

Greșeli frecvente

  • Uiți &: scanf("%d", x) trimite valoarea lui x ca adresă și scrie în memorie aleatorie.
  • Folosești %s fără limită de lungime: un cuvânt mai lung decât tabloul îl depășește. Scrie mereu lățimea: %19s pentru char[20].
  • Citești un double cu %f: la scanf, %f înseamnă float; pentru double este %lf.

Comenzi înrudite

  • std::printf: Afișează text formatat în stil C, cu marcaje precum %d, %s, %.2f.
  • std::cin: Citește valori de la tastatură în variabile, cu operatorul >>.
  • std::fopen: Deschide un fișier în stil C (fopen) și îl închide (fclose); lucrezi cu el prin FILE*.