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;
}
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;
}
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;
}
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.
#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;
}
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
#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;
}
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;
}
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;
}
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;
}
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;
}
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.