String

String adalah tipe data yang digunakan untuk menyimpan rangkaian karakter. Beberapa bahasa pemrograman menyimpan string dalam array. Beberapa bahasa pemrograman lain mengemas string beserta method dan propertinya dengan menggunakan object. Secara sederhana, cara penyimpanan string bisa dikelompokkan jadi 3 jenis.

  • Zero length string : String yang panjangnya disimpan dalam anggota array pertama (yang berindeks 0). Bahasa pemrograman yang memiliki string seperti ini misalnya pascal.
  • Null terminated string : String yang ditandai akhirnya dengan NULL (karakter ASCII dengan nilai 0).
  • String object : String yang disimpan dalam object. String dikemas bersama dengan method yang bisa digunakan untuk memanipulasi string tersebut.

Bahasa C++ menggunakan string yang disimpan sebagai object dengan nama tipe data string. Selain itu C++ juga bisa menggunakan null terminated string yang digunakan dalam bahasa C. Kedua jenis string tersebut punya kelebihan masing-masing. C++ tidak menggunakan zero length string kecuali kalau library eksternal yang kalian gunakan menyediakannya. Walaupun terlihat berbeda, keduanya sama-sama menggunakan tanda kutip ganda (") untuk mengapit rangkaian karakternya.

#include <iostream>

int main(){
    std::string s1 = "String object";
    char s2[256]="Null terminated String";
    std::cout << "S1=" << s1 << std::endl;
    std::cout << "S2=" << s2 << std::endl;
}
Output
S1=String object
S2=Null terminated String

Selanjutnya saya akan membahas penggunaan string object. Kalau kalian ingin belajar tentang null terminated string, kalian bisa membacanya di tulisan saya yang lain.

Function Getline

Kalau kalian menggunakan cin, kalian hanya akan mendapatkan satu kata sehingga kata lain setelah spasi diabaikan. Kalau kalian ingin mendapatkan semua karakter dalam satu baris, kalian bisa menggunakan method getline seperti di bawah ini.

#include <iostream>

using namespace std;

int main(){
string s;
    cout <<"Input : ";
    getline(std::cin, s);
    cout <<"Output : ";
    cout << s <<endl;
    return 0;
}
Contoh :
Input : Dua kata
Output : Dua kata

Getline memerlukan 2 argumen. Argumen pertama berupa jenis input yang digunakan. Kalian bisa menggunakan std::cin. Argumen kedua adalah nama variabelnya. Pada kode program di atas, contoh penggunaannya adalah "getline(std::cin, s)".

Operator String

Kalian bisa menggunakan tanda sama dengan (=) untuk memberi nilai pada variabel string. Kalian juga bisa menggunakan tanda tambah (+) sebagai operator concat untuk menggabungkan string object. Selain itu, kalian bisa menggunakan operator relasional untuk membandingkan dua string. Jadi, operator-operator yang bisa kalian gunakan pada tipe data object string, yaitu :

  • Assignment operator (=, +=)
  • concatenation (+)
  • []
  • Operator relasional (<, >, ==, <=, >=, !=)

Operator concat dan relasional hanya bisa digunakan pada string object. Kegunaannya akan berbeda jika digunakan pada "null terminated string". Selain saat deklarasi, operator assignment juga hanya bisa digunakan untuk string object.

Contoh :

#include <iostream>

using namespace std;

int main(){
string s1, s2;
    cout<<"Input : ";
    getline(std::cin, s1);
    if(s1!=s2){
        s1="Hai "+s1;
        cout<<"Output : ";
        cout << s1 <<endl;
    }
    return 0;
}
Contoh :
Input : Gerimisya stela rida
Output : Hai Gerimisya stela rida

Method dan Operasi String

Getline termasuk salah satu method yang dimiliki tipe data string. Untuk menggunakan method, kalian bisa meletakannya setelah nama variabel dan tanda titik. Penggunaan method sama dengan penggunaan function. Beberapa method memerlukan argumen yang diapit dengan tanda kurung. Method bisa berupa variabel, angka, atau nilai lainnya.

Ada beberapa method yang dimiliki tipe data string dalam bahasa C++. Method-method tersebut digunakan untuk mengakses karakter dan memanipulasi isi string.

  • at (indeks) : Mendapatkan satu karakter di dalam string.
  • back () : Mendapatkan karakter terakhir di dalam string.
  • front() : Mendapatkan karakter pertama di dalam string.
  • length() : Mendapatkan panjang string.
  • c_str() : Mengubah string object menjadi null terminated string.
  • substr(awal, panjang) : mendapatkan potongan string.
  • begin : Mendapatkan pointer awal string.
  • end : mendapatkan pointer akhir string.
  • rbegin : Mendapatkan pointer awal string untuk urutan terbalik. 
  • rend : Mendapatkan pointer akhir string untuk urutan terbalik. 
Berikut ini adalah contoh penggunaan method substr, front, dan, back.
#include <iostream>

using namespace std;

int main(){
string s;
int awal=1;
int panjang=3;
    cout <<"Input : ";
    getline(std::cin, s);
    cout << "Karakter Pertama = " << s.front() <<endl;
    cout << "Karakter Terakhir = " << s.back() <<endl;
    cout << "Substring(2, 3) = " << s.substr(2,3) <<endl;
    return 0;
}
Contoh :
Input : Sapiku
Karakter Pertama = S
Karakter Terakhir = u
Substring(2, 3) = pik

Function substring pada contoh di atas mengambil potongan string mulai dari indeks ke-2 (huruf ke-3) dengan panjang 3. Dua method lain yang digunakan pada contoh di atas adalah front dan back.

Akses Karakter

Untuk mendapatkan satu karakter di posisi tertentu dalam string kalian memerlukan method at. Method at menggunakan satu variabel atau angka untuk menentukan posisi karakter yang akan diambil untuk disalin atau ditampilkan. Posisi tersebut mirip indeks array yang dimulai dari 0. Jadi, huruf pertama indeksnya adalah 0, dan huruf lain posisinya berselisih satu dengan indeksnya.
#include <iostream>

using namespace std;

int main(){
string s;
    cout<<"Input : ";
    getline(std::cin, s);
    cout << "panjang string : ";
    cout << s.length() << endl;
    cout << "karakter pertama : ";
    cout << s.at(0) << endl;
    for(int i=1;i<s.length();i++){
        cout << "karakter ke-" << i+1 << " : ";
        cout << s.at(i) << endl;
    }
    return 0;
}
Contoh :
Input : Gerimisya stela rida
panjang string : 20
karakter pertama : G
karakter ke-2 : e
karakter ke-3 : r
karakter ke-4 : i
karakter ke-5 : m
karakter ke-6 : i
karakter ke-7 : s
karakter ke-8 : y
karakter ke-9 : a
karakter ke-10 :
karakter ke-11 : s
karakter ke-12 : t
karakter ke-13 : e
karakter ke-14 : l
karakter ke-15 : a
karakter ke-16 :
karakter ke-17 : r
karakter ke-18 : i
karakter ke-19 : d
karakter ke-20 : a

Pada contoh di atas, s.at(0) digunakan untuk mengakses karakter di indeks 0 atau posisi ke 1. Selain itu, di dalam loop, ada s.at(i) yang digunakan untuk mengakses karakter pada posisi lain untuk ditampilkan dengan cout.

Kalian juga bisa menggunakan operator [] untuk mengakses isi string berdasarkan indeksnya seperti saat menggunakan array. Hasilnya sama seperti saat kalian menggunakan at.

#include <iostream>

using namespace std;

int main(){
string s;
    cout<<"Input : ";
    getline(cin, s);
    cout << "panjang string : ";
    cout << s.length() << endl;
    cout << "karakter pertama : ";
    cout << s[0] << endl;

    for(int i=1;i<s.length();i++){
        cout << "karakter ke-" << i+1 << " : ";
        cout << s[i] << endl;
    }

    return 0;
}

Saat menggunakan loop, kalian mungkin akan sering memerlukan method length seperti contoh di atas. Method length digunakan untuk mendapatkan panjang string.

Menggunakan Iterator

Selain menggunakan loop dan method length, kalian bisa menggunakan iterator untuk mengakses seluruh isi string. Kalian juga bisa menggunakan reverse_iterator untuk membalik urutannya. Contoh penggunaan iterator bisa kalian lihat di bawah ini.

#include 

using namespace std;

int main(){
string s;
string::iterator it;
string::reverse_iterator rit;
    cout<<"Input : ";
    getline(std::cin, s);
    cout << "Urutan asli : ";
    for(it=s.begin();it!=s.end();++it){
        cout << *it << " ";
    }
    
    cout << endl;
    
    cout << "Urutan terbalik : ";
    for(rit=s.rbegin();rit!=s.rend();++rit){
        cout << *rit << " ";
    }
    return 0;
}
Contoh :
Input : kasur rusax
Urutan asli : k a s u r   r u s a x
Urutan terbalik : x a s u r   r u s a k

Iterator dan reverse_iterator dideklarasikan dengan tanda "::" bersama dengan nama tipe data, misalnya string::iterator. Keduanya bisa digunakan untuk string dan beberapa template STL.

Iterator diperlukan untuk menyimpan pointer string yang didapat dengan menggunakan begin, end, rbegin, dan rend. Pointer iterator string bisa digeser dengan operator increment(++) dalam perulangan.

Iterator perlu method begin dan end untuk menampilkan string dengan urutan aslinya. Jika kalian ingin menggunakan reverse_iterator untuk menampilkan urutan terbalik, kalian bisa menggunakan rbegin dan rend.

Konversi String Menjadi Bilangan

Untuk mengubah string menjadi bilangan, kalian bisa menggunakan atoi (untuk int) atau atof (untuk float) yang ada di dalam stdlib. Sayangnya, string yang jadi parameter kedua function tersebut adalah null terminated string yang biasa digunakan dalam Bahasa C. Untuk itu, kalian perlu method c_str.

#include <iostream>
#include <stdlib.h>

using namespace std;

int main(){
    string s="123.45";
    cout << "Penjumlahan : 123.45+5 =" << atof(s.c_str())+5 << endl;
    cout << "Concatenate : \"123.45\"+\"5\" = " << s+"5" << endl;
}
Output :
Penjumlahan : 123.45+5 =128.45
Concatenate : "123.45"+"5" = 123.455

Method c_str menunjuk ke array yang berisi string. Kalian hanya perlu menggunakannya jika string object tidak bisa digunakan.

Contoh di atas mengubah string menjadi angka (dengan fungsi atof) sebelum dijumlahkan dan di-concate. Kalau tipe data angkanya adalah bilangan bulat, kalian bisa menggunakan atoi.

Mengubah Tipe Data Lain Menjadi String

C++ juga menyediakan sprintf yang ada di dalam <stdio.h>. Fungsi sprintf bisa kalian gunakan untuk mengubah angka atau tipe data lain menjadi string.

#include <iostream>
#include <stdio.h>

using namespace std;
int main(){
	string s;
	char s_c[256];
	int angka=65535;
	
	sprintf(s_c, "%d", angka);	
	s="ini adalah ";
	s+=s_c;
	cout << s << endl;
	
	sprintf(s_c, "%x", angka);	
	s="Hexadesimalnya adalah ";
	s+=s_c;
	cout << s << endl;
}
Output :
ini adalah 65535
Hexadesimalnya adalah ffff

Swap

Pertukaran isi variabel memerlukan variabel penampung jika tidak dilakukan dengan menggunakan function. Untungnya, C++ menyediakan function swap untuk melakukan pertukaran dua string.

#include <iostream>

int main(){
        std::string s1="String 1";
        std::string s2="String 2";
	
        std::cout << "s1= " << s1 << std::endl;
        std::cout << "s2= " << s2 << std::endl;

        std::cout << std::endl << "Tukar ...." << std::endl;

        std::swap(s1, s2);
        std::cout << "s1= " << s1 << std::endl;
        std::cout << "s2= " << s2 << std::endl;
}
Output :
s1= String 1
s2= String 2

Tukar ....
s1= String 2
s2= String 1

String dan swap termasuk bagian dari "std", karena itu, kalian perlu "std::" jika tidak ada "using namespace std". Kalian bisa menyingkirkan semua "std::" dengan menambahkan using namespace seperti yang ada pada contoh-contoh sebelumnya.