Program yang menarik tidak hanya bicara lewat cout — ia juga mendengarkan. std::cin adalah objek input stream bawaan yang membaca apa yang diketik pengguna di terminal (standard input), dan operator >> mengekstrak datanya ke dalam variabel. Bersama-sama keduanya membuka pintu bagi program interaktif: kita bisa menanyakan nama, menerima angka, lalu mengolahnya. Pada Chapter ini kita mempelajari cara kerja cin >>, membaca beberapa nilai sekaligus, memahami mengapa cin >> string berhenti di spasi, dan mengenal std::getline untuk kalimat lengkap — plus pengenalan singkat tentang apa yang terjadi ketika input tidak sesuai harapan.
Objek cin dan Operator » #
Jika std::cout << x mengirim nilai x KE layar, maka std::cin >> x menarik data DARI keyboard ke dalam variabel x. Arah panah >> menggambarkan arah perpindahan data: dari stream menuju variabel, kebalikan dari <<. Sama seperti cout, cin adalah objek bertipe stream (std::istream) yang sudah tersambung ke standard input. Saat program mencapai std::cin >> x, ia berhenti dan menunggu sampai pengguna mengetik sesuatu lalu menekan Enter. Cara pakainya pun cermin dari cout: variabel tujuan harus sudah dideklarasikan sebelumnya, dan tipe variabel menentukan bagaimana teks yang diketik diurai — int diurai sebagai bilangan bulat, std::string diurai sebagai rangkaian karakter. Pada contoh-contoh chapter ini, blok kode memakai atribut stdin="...": alat verifikasi menyuplai teks tersebut ke program persis seperti pengguna mengetiknya di terminal.
Membaca Beberapa Nilai Sekaligus #
Operator >> bisa dirantai dalam satu pernyataan untuk membaca beberapa nilai berturut-turut. Pemisah antar nilai boleh spasi, tab, atau Enter — cin memperlakukannya sama sebagai whitespace:
#include <iostream>
int main() {
int a;
int b;
std::cout << "Masukkan dua angka (pisahkan dengan spasi): ";
std::cin >> a >> b; // dua ekstraksi dalam satu pernyataan
std::cout << "Jumlah " << a << " + " << b << " = " << a + b << "\n";
return 0;
}Output yang Dihasilkan:
Masukkan dua angka (pisahkan dengan spasi): Jumlah 12 + 30 = 42Input 12 30 dipisah spasi, dan std::cin >> a >> b mengambil keduanya: a menerima 12, b menerima 30. Kita juga bisa memberi Enter sebagai pemisah (12 lalu Enter lalu 30) dan hasilnya identik, karena >> melewati whitespace apa pun sebelum membaca. Perhatikan juga bahwa teks yang diketik pengguna tidak ikut tampil di output program — yang tercetak hanyalah apa yang program tulis sendiri. Di terminal sungguhan kita tetap melihat teks yang diketik, tetapi itu kerja terminal yang menggemakan ketikan (echo), bukan kerja program kita.
cin » string: Berhenti di Whitespace #
Perilaku cin >> pada std::string punya satu batasan penting yang wajib kita hafal: ekstraksi berhenti pada whitespace PERTAMA yang ditemui. Program berikut menunjukkan efeknya:
#include <iostream>
#include <string>
int main() {
std::string nama;
int umur;
std::cout << "Siapa nama Anda? ";
std::cin >> nama; // berhenti pada whitespace
std::cout << "Berapa umur Anda? ";
std::cin >> umur;
std::cout << "Halo, " << nama << "! Umur Anda " << umur << " tahun.\n";
return 0;
}Output yang Dihasilkan:
Siapa nama Anda? Berapa umur Anda? Halo, Budi! Umur Anda 21 tahun.Mari kita bedah:
- Baris 5-6: variabel dideklarasikan lebih dulu —
cinbutuh objek yang sudah ada untuk diisi. - Baris 8: prompt dicetak TANPA baris baru, sehingga di terminal sungguhan ketikan pengguna menyambung di baris yang sama.
- Baris 9 (
std::cin >> nama):>>melewati whitespace di depan, membaca token hingga whitespace berikutnya, lalu mengisinya kenama. InputBudimenghasilkannama = "Budi". - Baris 11 (
std::cin >> umur):>>mengurai teks menjadi bilangan bulat. Teks21dari input berhasil dikonversi menjadi angka 21. - Baris 13: sapaan final menyatukan kedua nilai. Kedua prompt tampak berdampingan di output karena input tidak tercetak oleh program.
Konsekuensi dari aturan “berhenti di whitespace”: jika pengguna mengetik Budi Santoso, variabel nama hanya menerima Budi, dan sisa Santoso tetap tertinggal di buffer untuk dibaca ekstraksi berikutnya. Untuk nama lengkap, alamat, atau kalimat apa pun yang mengandung spasi, kita butuh alat lain.
getline: Membaca Kalimat Lengkap #
std::getline membaca SATU BARIS penuh — semua karakter sampai pengguna menekan Enter, spasi termasuk — dan menyimpannya ke std::string tanpa karakter baris baru:
#include <iostream>
#include <string>
int main() {
std::string nama;
std::string hobi;
std::cout << "Nama lengkap: ";
std::getline(std::cin, nama); // membaca satu baris penuh
std::cout << "Hobi: ";
std::getline(std::cin, hobi);
std::cout << nama << " menyukai " << hobi << ".\n";
return 0;
}Output yang Dihasilkan:
Nama lengkap: Hobi: Budi Santoso menyukai membaca buku.Kali ini Budi Santoso tersimpan utuh sebagai satu string, spasi dan semua. Perhatikan bentuk pemanggilannya berbeda dari >>: getline adalah fungsi yang menerima stream dan variabel tujuan (std::getline(std::cin, nama)), bukan operator. Kalimat yang mengandung spasi kini aman dibaca. Rujukan parameter dan perilakunya dijelaskan detail di cppreference
.
Ketika Input Gagal #
Apa jadinya jika program meminta angka tetapi pengguna mengetik dua puluh satu? Ekstraksi std::cin >> umur gagal mem-parse, dan stream masuk ke keadaan gagal (fail state): ekstraksi berikutnya tidak melakukan apa-apa sampai keadaan itu dibersihkan. Kita bisa mendeteksi kejadian ini karena ekspresi std::cin >> umur sendiri menghasilkan stream yang bisa diuji kebenarannya:
int umur;
if (!(std::cin >> umur)) {
// tiba di sini bila input bukan angka — tangani kegagalan di sini
}Struktur if memang belum kita pelajari (tunggu di Section Control Flow), jadi anggap potongan di atas sekadar pengenalan bentuknya: “uji apakah ekstraksi berhasil; bila tidak, jalankan penanganan”. Pola memvalidasi input secara tuntas — membersihkan stream, meminta ulang, membatasi nilai — dibedakan khusus pada Chapter Input Validation.
Dengan cout dan cin, percakapan program kita sudah dua arah. Namun stream standar ternyata tidak hanya dua: Chapter berikutnya mengenalkan std::cerr dan std::clog — saluran khusus untuk pesan galat dan log, beserta cara memisahkannya dari output biasa lewat redirect di terminal.