Menyimpan dan mencetak teks saja tidak cukup untuk pekerjaan nyata: kita perlu memotong nama berkas, mencari kata kunci, mengganti teks lama, membersihkan spasi, dan mengubah angka menjadi teks untuk ditampilkan. std::string menyediakan semua itu sebagai anggota kelasnya — fungsi-fungsi yang dipanggil dengan notasi titik seperti s.substr(...), mengikuti pola member function yang akan kita tulis sendiri pada Section Pemrograman Berorientasi Objek. Untuk sekarang cukup perlakukan mereka sebagai kotak alat siap pakai. Pada Chapter ini kita memakai operasi-operasi inti tersebut dalam satu program dan membaca hasilnya baris per baris.

Memotong, Mencari, Mengubah #

Program berikut menyusuri operasi yang paling sering terpakai. Seluruh posisi dihitung dari 0 seperti indeks array:

cpp
#include <iostream>
#include <string>

int main() {
    std::string kalimat = "belajar cpp itu menyenangkan";

    // substr(posisi, panjang): ambil potongan teks
    std::string kata = kalimat.substr(8, 3);
    std::cout << "substr(8, 3)          : " << kata << "\n";

    // find: posisi pertama kemunculan; npos berarti tidak ditemukan
    std::size_t posisi = kalimat.find("cpp");
    std::cout << "find(\"cpp\")           : " << posisi << "\n";
    std::cout << "find(\"python\")        : "
              << (kalimat.find("python") == std::string::npos ? "tidak ditemukan"
                                                             : "ditemukan")
              << "\n";

    // replace(posisi, panjang, teks baru)
    std::string s1 = kalimat;
    s1.replace(posisi, 3, "C++");
    std::cout << "replace               : " << s1 << "\n";

    // insert(posisi, teks): sisipkan; erase(posisi[, panjang]): buang
    std::string s2 = kalimat;
    s2.insert(0, ">> ");
    std::cout << "insert                : " << s2 << "\n";
    s2.erase(14);  // buang mulai posisi 14 sampai akhir
    std::cout << "erase(14)             : " << s2 << "\n";

    // starts_with / ends_with (C++20): pemeriksaan awalan dan akhiran
    std::cout << "starts_with(\"belajar\"): " << kalimat.starts_with("belajar")
              << "\n";
    std::cout << "ends_with(\"banget\")   : " << kalimat.ends_with("banget")
              << "\n";

    // konversi angka <-> teks
    int umur = std::stoi("20");
    std::cout << "stoi(\"20\") + 8        : " << umur + 8 << "\n";

    double harga = std::stod("19.5");
    std::cout << "stod(\"19.5\") * 2      : " << std::to_string(harga * 2)
              << "\n";

    std::cout << "to_string(255)        : " << std::to_string(255) << "\n";

    return 0;
}

Output yang Dihasilkan:

text
substr(8, 3)          : cpp
find("cpp")           : 8
find("python")        : tidak ditemukan
replace               : belajar C++ itu menyenangkan
insert                : >> belajar cpp itu menyenangkan
erase(14)             : >> belajar cpp
starts_with("belajar"): 1
ends_with("banget")   : 0
stoi("20") + 8        : 28
stod("19.5") * 2      : 39.000000
to_string(255)        : 255

Mari kita bedah operasi demi operasi:

  1. Baris 8 (kalimat.substr(8, 3)): mengambil potongan mulai posisi 8 sepanjang 3 karakter — menghasilkan string baru "cpp", tanpa mengubah kalimat. Dua argumennya boleh dilepas: substr(8) mengambil sampai akhir teks.
  2. Baris 11-15 (find): mengembalikan posisi kemunculan pertama (8 untuk "cpp"). Bila tidak ditemukan, find mengembalikan konstanta std::string::npos — nilai khusus “posisi tidak sah” — sehingga pemeriksaan != std::string::npos menjadi cara standar mengetes keberadaan.
  3. Baris 18-19 (replace(posisi, 3, "C++")): membuang 3 karakter mulai posisi 8 lalu menyisipkan teks baru di tempatnya. Panjang teks baru boleh berbeda dari panjang yang dibuang; di sini 3 karakter diganti 3 karakter lain.
  4. Baris 22-25 (insert dan erase): insert(0, ">> ") menyisipkan di posisi paling depan sehingga seluruh isi bergeser. erase(14) tanpa argumen kedua membuang mulai posisi 14 sampai akhir — versi dua argumen, erase(14, 5), membuang tepat 5 karakter.
  5. Baris 28-31 (starts_with / ends_with): pasangan fungsi dari C++20 untuk mengetes awalan dan akhiran. Hasilnya bertipe bool yang tercetak sebagai 1 (benar) dan 0 (salah) pada std::cout.
  6. Baris 34-40 (stoi, stod, to_string): stoi membaca angka bulat dari awal teks, stod membaca bilangan desimal, dan to_string mengarahkan sebaliknya. Perhatikan to_string(39.0) tercetak "39.000000" karena format bawaannya memakai enam angka di belakang koma — cara memformat desimal dengan rapi dibahas pada manipulator output di Section Input-Output dan File.

Kombinasi dalam Praktik #

Kekuatan operasi string sebenarnya muncul saat digabung. Contoh pola yang sering kita tulis: memvalidasi ekstensi berkas dengan namaBerkas.ends_with(".csv"), memotong nama domain dari email dengan email.substr(0, email.find('@')), atau menghapus spasi terdepan dengan erase di dalam loop. Perhatikan pola penting di program di atas: replace, insert, dan erase mengubah string pada tempatnya (memodifikasi objek asli), sementara substr dan find mengembalikan hasil tanpa menyentuh aslinya. Karena itu program menyalin kalimat ke s1 dan s2 lebih dahulu — kalimat tetap utuh untuk operasi berikutnya.

Sisi yang perlu diwaspadai adalah posisi yang melampaui panjang teks. substr dengan posisi di luar batas melempar exception std::out_of_range (mekanisme lempar-tangkap yang sudah kita lihat pada Chapter std::array), sedangkan erase dengan posisi yang terlalu besar melempar std::out_of_range juga. Jadi selalu pastikan posisi hasil find tidak bernilai npos sebelum dipakai sebagai posisi substr atau replace — kombinasi pemeriksaan ini adalah bentuk pertahanan minimal untuk kode pengolah teks.

Chapter berikutnya membahas std::string_view: cara “melihat” teks milik pihak lain — literal, std::string, atau potongannya — tanpa menyalin satu byte pun.

Rujukan resmi: cppreference — std::string operations (substr, find, dst.) , cppreference — std::basic_string::find , cppreference — stoi/stod .