Dasar std::string dan std::string_view sudah kita pelajari pada Section Array dan String; Chapter ini menyambungnya dengan sisi yang paling sering dipakai di program nyata. Kita sering menerima data sebagai satu baris teks — dari file, dari pengguna, atau dari jaringan — lalu perlu menguraikannya menjadi potongan bermakna: nama, angka, dan kategori. Pekerjaan itu berdiri di atas tiga kemampuan: mencari posisi dengan keluarga find, memotong dengan substr, dan mengubah teks menjadi angka (atau sebaliknya). Pada akhir chapter, kita juga menegaskan kapan teks sebaiknya disimpan sebagai std::string dan kapan cukup dibaca lewat std::string_view.
Konversi String dan Angka #
Header <string> menyediakan kelompok fungsi std::stoi (string to int), std::stol, std::stoll, std::stof, dan std::stod untuk mengubah teks menjadi bilangan, plus std::to_string untuk arah sebaliknya. Fungsi-fungsi ini membaca dari depan dan berhenti pada karakter pertama yang bukan bagian angka, sehingga std::stoi("21 tahun") sah dan menghasilkan 21. Arah sebaliknya juga penting: saat kita ingin menyusun pesan laporan, std::to_string(42) menghasilkan "42" sehingga bisa dirangkai dengan +.
#include <iostream> // std::cout
#include <string> // std::string, std::stoi, std::stod, std::to_string
#include <string_view> // std::string_view: jendela baca-saja
int main() {
// baris data gaya CSV yang akan kita uraikan
std::string baris = "Budi,21,Teknik Informatika";
// find: cari posisi pemisah; mengembalikan indeks karakter pertama
std::size_t koma1 = baris.find(',');
std::size_t koma2 = baris.find(',', koma1 + 1);
std::cout << "Koma pertama di posisi " << koma1 << "\n";
std::cout << "Koma kedua di posisi " << koma2 << "\n";
// substr(posisi, panjang): ambil potongan teks sebagai string baru
std::string nama = baris.substr(0, koma1);
int umur = std::stoi(baris.substr(koma1 + 1, koma2 - koma1 - 1));
std::string prodi = baris.substr(koma2 + 1);
std::cout << "Nama : " << nama << "\n";
std::cout << "Umur : " << umur << " tahun\n";
std::cout << "Prodi: " << prodi << "\n";
// konversi dua arah: string <-> angka
double ipk = std::stod("3.85");
std::string ringkasan = std::to_string(umur) + " tahun, IPK "
+ std::to_string(ipk);
std::cout << "Ringkasan: " << ringkasan << "\n";
// find family: pencarian varian lain
std::size_t pos = baris.find("Informatika");
std::cout << "'Informatika' mulai di posisi " << pos << "\n";
std::cout << "Koma terakhir di posisi " << baris.rfind(',') << "\n";
std::cout << "Temuan 'Sistem': "
<< (baris.find("Sistem") == std::string::npos ? "tidak ada" : "ada")
<< "\n";
// string_view: jendela baca-saja tanpa menyalin isi
std::string_view sv = baris;
std::string_view svProdi = sv.substr(koma2 + 1);
std::cout << "Prodi via view: " << svProdi << "\n";
std::cout << "Panjang view : " << svProdi.size() << "\n";
return 0;
}Output yang Dihasilkan:
Koma pertama di posisi 4
Koma kedua di posisi 7
Nama : Budi
Umur : 21 tahun
Prodi: Teknik Informatika
Ringkasan: 21 tahun, IPK 3.850000
'Informatika' mulai di posisi 15
Koma terakhir di posisi 7
Temuan 'Sistem': tidak ada
Prodi via view: Teknik Informatika
Panjang view : 18Mari kita bedah:
- Baris 7 (
std::string baris = ...): satu baris data gaya CSV berisi tiga kolom yang dipisah koma. Tugas program kita: memecahnya menjadi tiga nilai bertipe berbeda. - Baris 10-11 (
baris.find(',')): pemanggilan pertama mencari koma dari awal, menghasilkan posisi4. Pemanggilan kedua mulai darikoma1 + 1, sehingga menemukan koma berikutnya di posisi7— pola “cari lalu lanjut dari titik itu” yang sering kita pakai. - Baris 16-18 (
substr):substr(posisi, panjang)menyalin potongan menjadi string baru. Bagian umur dihitung panjangnyakoma2 - koma1 - 1, yaitu"21", lalu langsung dikonversistd::stoimenjadiint. Tanpa panjang eksplisit,substrberjalan sampai akhir string — dipakai untukprodi. - Baris 25-28 (konversi dua arah):
std::stod("3.85")menghasilkan3.85, sedangkanstd::to_stringmenyusun ringkasan kembali. Perhatikan outputIPK 3.850000:to_stringuntukdoubleselalu mencetak enam angka desimal — bila formatnya penting, alat yang lebih pas adalahstd::formatyang kita bahas nanti di Section Modern C++. - Baris 31-36 (find family):
findmengembalikan indeks kemunculan pertama,rfindmencari dari belakang. Bila target tidak ditemukan, keduanya mengembalikan konstanta khususstd::string::npos, dan itulah yang kita bandingkan di baris 35 untuk menyimpulkan “tidak ada”. - Baris 39-42 (string_view):
svhanya mencatat alamat dan panjangbaris, tanpa menyalin.substrmilik view pun tidak menyalin — ia sekadar menggeser jendela, sehinggasvProditetap menunjuk teks milikbarisdan panjangnya18.
Keluarga find dalam Satu Tabel #
Semua fungsi pencarian std::string mengembalikan std::size_t dan konstanta npos bila gagal — pola yang sama, arah pencariannya berbeda.
| Fungsi | Mencari | Contoh hasil pada "kopi-teh" |
|---|---|---|
find | kemunculan pertama | find("teh") → 5 |
rfind | kemunculan terakhir | rfind("i") → 2 |
find_first_of | karakter pertama yang ada di himpunan | find_first_of("ie") → 2 |
find_last_of | karakter terakhir yang ada di himpunan | find_last_of("ie") → 7 |
Pola npos juga menjadi cara paling ringkas untuk menanyakan “apakah ada?”: teks.find("abc") != std::string::npos bernilai true hanya bila "abc" terkandung di dalamnya.
Kapan string, Kapan string_view #
Aturannya sekarang bisa kita rumuskan tegas. Pakai std::string ketika fungsi perlu menyimpan atau mengubah teks: hasil parsing, kolom database, isi pesan yang dikirim ke fungsi lain melewati batas hidup variabel. Pakai std::string_view ketika fungsi hanya membaca teks yang milik orang lain: menghitung, mencari, membandingkan, memformat. View tidak menyalin apa pun, tetapi juga tidak memiliki apa pun — view ke string sementara yang sudah dihapus adalah dangling view, bahaya yang kita bedah tuntas pada Chapter string_view di Section Array dan String.
Menguasai teks adalah setengah dari pekerjaan data; setengah lainnya adalah menampung banyak nilai sekaligus. Chapter berikutnya membandingkan dua container sekuensial paling fundamental yang sudah kita kenal — std::array dan std::vector — dari sisi operasi lanjutannya.
Rujukan resmi: cppreference — std::basic_string , cppreference — std::stol, std::stoll, std::stod , cppreference — std::basic_string_view .