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 +.

cpp
#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:

text
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  : 18

Mari kita bedah:

  1. 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.
  2. Baris 10-11 (baris.find(',')): pemanggilan pertama mencari koma dari awal, menghasilkan posisi 4. Pemanggilan kedua mulai dari koma1 + 1, sehingga menemukan koma berikutnya di posisi 7 — pola “cari lalu lanjut dari titik itu” yang sering kita pakai.
  3. Baris 16-18 (substr): substr(posisi, panjang) menyalin potongan menjadi string baru. Bagian umur dihitung panjangnya koma2 - koma1 - 1, yaitu "21", lalu langsung dikonversi std::stoi menjadi int. Tanpa panjang eksplisit, substr berjalan sampai akhir string — dipakai untuk prodi.
  4. Baris 25-28 (konversi dua arah): std::stod("3.85") menghasilkan 3.85, sedangkan std::to_string menyusun ringkasan kembali. Perhatikan output IPK 3.850000: to_string untuk double selalu mencetak enam angka desimal — bila formatnya penting, alat yang lebih pas adalah std::format yang kita bahas nanti di Section Modern C++.
  5. Baris 31-36 (find family): find mengembalikan indeks kemunculan pertama, rfind mencari dari belakang. Bila target tidak ditemukan, keduanya mengembalikan konstanta khusus std::string::npos, dan itulah yang kita bandingkan di baris 35 untuk menyimpulkan “tidak ada”.
  6. Baris 39-42 (string_view): sv hanya mencatat alamat dan panjang baris, tanpa menyalin. substr milik view pun tidak menyalin — ia sekadar menggeser jendela, sehingga svProdi tetap menunjuk teks milik baris dan panjangnya 18.

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.

FungsiMencariContoh hasil pada "kopi-teh"
findkemunculan pertamafind("teh") → 5
rfindkemunculan terakhirrfind("i") → 2
find_first_ofkarakter pertama yang ada di himpunanfind_first_of("ie") → 2
find_last_ofkarakter terakhir yang ada di himpunanfind_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 .