Kita sebenarnya sudah memakai std::string sejak Section Dasar Pemrograman — kini saatnya mengenalnya secara utuh. std::string adalah tipe teks milik pustaka standar (header <string>) yang mengelola sendiri memori di balik layar: teks bisa tumbuh dan menyusut mengikuti isi, tanpa kita menghitung kapasitas buffer seperti pada C-style string. Ia juga terintegrasi dengan operator C++ sehingga teks digabung dengan +, dibandingkan dengan ==, dan diakses per karakter dengan kurung siku. Pada Chapter ini kita mempelajari konstruksi dan pengubahan std::string, cara membaca teks berisi spasi dari input dengan std::getline, dan perilaku yang membedakannya dari cin >>.
Konstruksi, Concatenation, dan Akses #
Program berikut merangkum operasi dasar yang paling sering kita tulis:
#include <iostream>
#include <string>
int main() {
// tiga cara mengonstruksi std::string
std::string sapaan = "Halo"; // dari string literal
std::string nama("Budi"); // konstruktor langsung
std::string kosong; // string kosong, berisi ""
// assignment dan concatenation: teks baru dibangun dengan +
kosong = sapaan + ", " + nama + "!";
std::cout << kosong << "\n";
// panjang isi: .size() dan aliasnya .length() menghasilkan angka sama
std::cout << "panjang : " << kosong.size() << " karakter\n";
// akses per karakter lewat indeks, seperti array
std::cout << "pertama : " << kosong[0] << "\n";
std::cout << "terakhir: " << kosong[kosong.size() - 1] << "\n";
// perbandingan isi memakai operator biasa
if (nama == "Budi") {
std::cout << "cocok : nama memang Budi\n";
}
// mengubah satu karakter lewat indeks
nama[0] = 'b';
std::cout << "diubah : " << nama << "\n";
return 0;
}Output yang Dihasilkan:
Halo, Budi!
panjang : 11 karakter
pertama : H
terakhir: !
cocok : nama memang Budi
diubah : budiMari kita bedah:
- Baris 7-9 (konstruksi): ketiga bentuk menghasilkan
std::stringyang sama. Bentuk= "..."adalah yang paling lazim; string literal"Halo"disalin ke dalam memori yang dikelolasapaan, sehinggasapaanhidup sendiri, tidak menumpang pada literal. - Baris 12 (
kosong = sapaan + ", " + nama + "!";): operator+merangkai teks menjadi string baru dan=menyimpannya. Hasilnya"Halo, Budi!"dengan panjang 11 —std::stringmenampungnya tanpa kita menghitung ukuran buffer sedikit pun. - Baris 15 (
.size()): mengembalikan jumlah karakter saat ini. Anggota.length()melakukan hal yang sama persis; keduanya ada karena alasan historis dan pilihannya hanya soal selera. - Baris 18-19 (indeks): akses per karakter memakai kurung siku, identik dengan array. Elemen pertama indeks
0, terakhirsize() - 1. - Baris 22-24 (
nama == "Budi"): operator==membandingkan isi teks — inilah kemudahan besar dibandingstrcmppada C-style string. Operator<dan>juga berfungsi (perbandingan urutan kamus), sehingga daftar nama bisa diurutkan. - Baris 27-28 (
nama[0] = 'b';): satu karakter diganti lewat indeks.std::stringtidak bersifat immutable; isinya bebas diubah.
Membaca Baris dengan std::getline #
Operator cin >> membaca kata: eksekusinya berhenti pada spasi pertama, sehingga input "Budi Santoso" hanya menghasilkan "Budi". Untuk teks yang boleh berisi spasi, gunakan fungsi std::getline(cin, variabel) yang membaca seluruh baris sampai tombol Enter:
#include <iostream>
#include <string>
int main() {
std::string nama;
std::string hobi;
std::cout << "Siapa nama Anda? ";
std::getline(std::cin, nama); // membaca seluruh baris, spasi termasuk
std::cout << "Apa hobi Anda? ";
std::getline(std::cin, hobi);
std::cout << "Halo, " << nama << "!\n";
std::cout << nama << " menyukai " << hobi << ".\n";
std::cout << "Panjang hobi: " << hobi.size() << " karakter\n";
return 0;
}Output yang Dihasilkan:
Siapa nama Anda? Apa hobi Anda? Halo, Budi Santoso!
Budi Santoso menyukai membaca buku.
Panjang hobi: 12 karakterSaat dijalankan, program menerima dua baris input: Budi Santoso untuk nama dan membaca buku untuk hobi. Kedua spasi tetap utuh — perhatikan "Budi Santoso" tampil lengkap dan panjang hobi terhitung 12 karakter termasuk spasi di antara dua kata. Prompt kedua tampil menyatu pada baris yang sama di transkrip di atas karena output program dan input terminal memang saling berselang-seling pada satu baris yang sama.
Di Balik Layar: Tumbuh Tanpa Berisik #
Perbedaan terbesar std::string dari array char adalah pengelolaan memori otomatis. Bila teks baru lebih panjang dari kapasitas saat ini, std::string memesan memori yang lebih besar, menyalin isinya, lalu membuang wadah lama — semua terjadi di balik operator + dan =. Mekanisme pemesanan memori dinamis semacam ini sama dengan yang dipakai std::vector (Chapter std::vector), karena std::string memang container karakter: koleksi char dengan antarmuka khusus teks. Itu pula alasan std::string punya .size(), indeks, dan iterasi — sama seperti koleksi lain yang akan kita temui.
Sisi harganya kecil tetapi nyata: penggabungan bertingkat dalam loop panjang bisa memicu banyak pemesanan ulang. Untuk kasus umum dan materi pembelajaran ini, + dan = adalah pilihan yang tepat; teknik pemaduan yang hemat memori (misalnya append atau reserve) dibahas saat kita sampai di performa container.
Chapter berikutnya melengkapi kotak alat teks kita: fungsi-fungsi manipulasi std::string seperti substr, find, replace, sampai konversi angka-ke-teks dan teks-ke-angka.
Rujukan resmi: cppreference — std::string , cppreference — std::getline .