std::cin în C++

Citește valori de la tastatură în variabile, cu operatorul >>.

Sintaxă
#include <iostream>
std::cin >> variabila1 >> variabila2 >> ...;

Ce face std::cin

std::cin (de la „character input”) este intrarea standard: de obicei, ce scrie utilizatorul la tastatură. Operatorul >> citește o valoare și o pune în variabilă, transformând-o automat în tipul variabilei (int, double, std::string).

>> sare peste spațiile de la început și se oprește la primul spațiu, tab sau rând nou. De aceea, pentru un text cu spații (un nume complet, o adresă) folosești std::getline.

Dacă utilizatorul scrie altceva decât se așteaptă (litere în loc de număr), citirea eșuează: variabila primește 0, iar std::cin intră în stare de eroare și ignoră citirile următoare până la std::cin.clear(). Condiția if (std::cin >> x) îți spune dacă citirea a reușit.

Ce returnează

Expresia std::cin >> x returnează tot std::cin. Folosit într-o condiție, este adevărat dacă citirea a reușit.

Exemple

Exemplul 1: Citirea unui nume și a unei vârste

Valorile sunt separate prin spațiu sau Enter; >> le citește în ordine.

#include <iostream>
#include <string>

int main() {
    std::string nume;
    int varsta;
    std::cout << "Cum te cheamă și câți ani ai? ";
    std::cin >> nume >> varsta;
    std::cout << "\nSalut, " << nume << "! Peste 10 ani vei avea " << varsta + 10 << " ani.\n";
}

Ce scrie utilizatorul (intrare)

Ana 21

Rezultat

Cum te cheamă și câți ani ai? 
Salut, Ana! Peste 10 ani vei avea 31 ani.

Exemplul 2: Citirea numerelor până la sfârșitul intrării

Bucla while (std::cin >> nota) se oprește când nu mai sunt date (sau când apare ceva ce nu este număr).

#include <iostream>

int main() {
    int nota, suma = 0, cate = 0;
    while (std::cin >> nota) {
        suma += nota;
        ++cate;
    }
    std::cout << "Note citite: " << cate << '\n';
    std::cout << "Media: " << static_cast<double>(suma) / cate << '\n';
}

Ce scrie utilizatorul (intrare)

9 7 10
8

Rezultat

Note citite: 4
Media: 8.5

Exemplul 3: Ce se întâmplă când utilizatorul greșește

Textul zece nu este număr, deci citirea eșuează, x devine 0, iar std::cin rămâne în stare de eroare până la clear().

#include <iostream>
#include <string>

int main() {
    int x = 5;
    if (!(std::cin >> x)) {
        std::cout << "Nu ai scris un număr. x = " << x << '\n';
        std::cin.clear();          // scoatem fluxul din starea de eroare
        std::string gresit;
        std::cin >> gresit;        // consumăm textul greșit
        std::cout << "Ai scris: " << gresit << '\n';
    }
    std::cin >> x;
    std::cout << "A doua încercare: x = " << x << '\n';
}

Ce scrie utilizatorul (intrare)

zece
10

Rezultat

Nu ai scris un număr. x = 0
Ai scris: zece
A doua încercare: x = 10

Greșeli frecvente

  • Citești un nume cu spații cu std::cin >> nume: pentru „Ana Maria” primești doar „Ana”, iar „Maria” rămâne pentru următoarea citire. Folosește std::getline.
  • Amesteci std::cin >> cu std::getline: după >>, Enter-ul rămâne în intrare și getline citește un rând gol. Pune std::cin >> std::ws sau std::cin.ignore(...) între ele.
  • Nu verifici dacă citirea a reușit. După o citire eșuată, toate citirile următoare sunt ignorate în tăcere și programul lucrează cu valori greșite.

Comenzi înrudite

  • std::getline: Citește un rând întreg, cu spații cu tot, într-un std::string.
  • std::cout: Afișează text și valori în consolă, cu operatorul <<.
  • std::istream::ignore: Sare peste caractere din intrare, de obicei până la sfârșitul rândului curent.
  • std::istream::eof: Verifică starea unui flux: eof (sfârșitul datelor) și fail (citire eșuată).
  • std::scanf: Citește valori formatate de la tastatură în stil C, primind adresele variabilelor.