Bab. 10 Kelas string dan
Pemrosesan String
Tujuan
Instruksional
|
|
·
Penugasan dan
penyambungan string.
·
Membandingkan string.
·
Substring.
·
Menukar string.
·
Karakteristik string.
|
·
Mencari substring
dan karakter di dalam string.
·
Mengganti karakter
di dalam string.
·
Menyisipkan
karakter ke dalam string.
·
Iterator.
|
10.1 Introduksi
Template kelas basic_string menyediakan beberapa operasi manipulasi string seperti
menyalin, mencari, dan lainnya. Definisi template dan semua fasilitas pendukung
didefinisikan di dalam namespace std,
yang menyertakan statemen typedef
typedef basic_string< char > string;
yang menciptakan tipe alias string untuk basic_string<char>.
Sebuah typedef juga disediakan untuk
tipe whcar_t (wstring). Tipe wchar_t1 menyimpan karakter-karakter
(karakter dua-byte, karakter empat-byte, dan lainna) untuk mendukung himpunan
karakter lain. Untuk menggunakan string, Anda perlu mencantumkan header <string>.
Sebuah objek string dapat diinisialisasi dengan argumen konstruktor seperti
string teks( "Hallo"
); // menciptakan sebuah string dari
const char *
yang menciptakan sebuah string yang memuat karakter-karakter “Hallo”, atau dengan dua argumen
konstruktor seperti
string nama( 8, 'x' ); // string
yang memuat 8 buah karakter 'x'
yang menciptakan sebuah string yang
memuat delapan buah karakter ‘x’.
Kelas string juga menyediakan sebuah
konstruktor default (yang menciptakan suatu string kosong) dan sebuah
konstruktor penyalin. Sebuah string juga dapat diinisialisasi di dalam
definisinya seperti
string bulan = "Maret"; // sama dengan: string bulan( "Maret" );
Ingat bahwa = bukanlah penugasan;
tetapi merupakan pemanggilan implisit terhadap konstruktor kelas string, yang melakukan konversi.
Kelas string tidak menyediakan konversi dari int atau char ke string di dalam sebuah definisi string. Sebagai contoh, definisi
string error1 = 'c';
string error2( 'u' );
string error3 = 22;
string error4( 8 );
yang akan menghasilkan error sintaks.
Penugasan sebuah karakter kepada objek string
diijinkan di dalam suatu statemen penugasan seperti
string1 = 'n';
Tidak seperti char * (string versi C), string tidak harus diakhiri dengan
karakter null. Panjang sebuah string
dapat dicari menggunakan fungsi anggota length
dan menggunakan fungsi anggota size.
Operator subskript [ ] dapat digunakan bersama string untuk mengakses dan
memodifikasi karakter individual. Seperti string versi-C, string mempunyai subskript pertama 0 dan
subskript terakhir length() – 1.
Kebanyakan fungsi anggota di dalam
kelas string mengambil sebagai
argumen sebuah lokasi subskript awal dan jumlah karakter untuk dioperasikan.
Operator ekstraksi aliran >> dioverload untuk mendukung kelas string. Statemen
string
objekString;
cin >>
objekString;
mendeklarasikan sebuah objek string dan membaca objek tersebut dari cin. Masukan dipisahkan oleh karakter
spasi putih. Ketika pembatas (delimiter) dijumpai, operasi masukan terhenti.
Fungsi getline juga dioverload untuk string. Diasumsikan bahwa string1
adalah sebuah objek string, statemen
getline( cin,
string1 );
membaca dan menempatkan sebuah objek string dari papanketik ke dalam string1. Masukan dipisahkan atau
dibatasi oleh karakter garis-baru (‘\n’), jadi getline dapat membaca sebaris teks dan menempatkannya ke dalam
sebuah objek string. Anda bisa
menspesifikasi sebuah delimiter opsional sebagai argumen ketiga pada getline.
10.2 Penugasan dan Penyambungan string
Gambar 10.2 mendemonstrasikan penugasan
dan penyambungan string. Baris 4
mencantumkan header <string>
untuk kelas string. Tiga objek string, string1, string2, dan string3 diciptakan pada baris 9-11.
Baris 13 menugaskan nilai dari string1
kepada string2. Setelah penugasan
terjadi, string2 menjadi salinan dari
string1. Baris 14 menggunakan fungsi
anggota copy untuk menyalin string1 ke dalam string3. Kelas string
juga menyediakan versi teroverload
dari fungsi anggota assign yang
menyalin sejumlah karakter, seperti di dalam
stringTarget.assign(
stringSumber, awal, jumlahKarakter );
dimana stringSumber adalah objek string
yang akan disalin, awal adalah
subskript awal dan jumlahKarakter
adalah jumlah karakter yang akan disalin.
Gambar 10.1 Mendemonstrasikan Penugasan dan
Penyambungan string
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
// Gambar 10.1: gambar17_1.cpp
// Mendemonstrasikan penugasan dan
penyambungan string.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string string1( "gadjah"
);
string string2; //
diinisialisasi dengan string kosong
string string3; //
diinisialisasi dengan string kosong
string2 = string1; //
menugaskan string1 kepada string2
string3.assign( string1 ); //
menugaskan string1 kepada string3
cout
<< "string1: " << string1 << "\nstring2:
" << string2
<<
"\nstring3: " << string3 << "\n\n";
//
memodifikasi string2 dan string3
string2[ 0 ] = string3[ 2 ] =
'r';
cout
<< "Setelah modifikasi atas string2 dan string3:\n"
<< "string1: "
<< string1 << "\nstring2:
" << string2 << "\nstring3: ";
// mendemonstrasikan fungsi anggota at
for ( int i = 0; i< string3.length();++i )
cout << string3.at( i );
//
mendeklarasikan string4 dan string5
string string4( string1 +
"MADA" ); // penyambungan
string
string5; // diinisialisasi dengan string kosong
//
operator teroverload +=
string3 += "mada";
// menciptakan "garjahmada"
string1.append(
"Mada" ); // create "gadjahMada"
//
menyambung lokasi subskript 6 sampai akhir dari string1 untuk
//
menciptakan string "Mada" (string5 awalnya kosong)
string5.append( string1, 6,
string1.length() - 6 );
cout << "\n\nSetelah
penyambungan:\nstring1: " << string1
<< "\nstring2: "
<< string2 << "\nstring3: " << string3
<< "\nstring4: "
<< string4 << "\nstring5: " << string5
<< endl;
} // akhir dari main
|
string1:
gadjah
string2:
gadjah
string3:
gadjah
Setelah
modifikasi atas string2 dan string3:
string1:
gadjah
string2:
radjah
string3:
garjah
Setelah
penyambungan:
string1:
gadjahMada
string2:
radjah
string3:
garjahmada
string4:
gadjahMADA
string5: Mada
Baris 19 menggunakan operator subskript
untuk menugaskan ‘r’ kepada string3[2]
(membentuk “garjah”) dan menugaskan
‘r’ kepada string2[0] (membentuk “radjah”). Ketiga objek string kemudian ditampilkan.
Baris 25-26 menampilkan isi string3 satu karakter per unit waktu
menggunakan fungsi anggota at. Fungsi
anggota at menyediakan akses
terperiksa (atau pemeriksaan rentang); pengaksesan terhadap elemen yang
melewati akhir dari string akan
melempar eksepsi out_of_range.
Operator subskript [ ] tidak menyediakan akses terperiksa.
String string4 dideklarasikan pada baris 29 dan diinisialisasi dengan
hasil penyambungan dari string1 dan “MADA” menggunakan operator teroverload +, yang untuk kelas string berarti penyambungan. Baris 33
menggunakan operator penugasan penjumlahan, +=, untuk menyambung string3 dan “mada”. Baris 34 menggunakan fungsi anggota append untuk menyambung string1
dan “Mada”.
Baris 38 menyambung string “Mada” untuk mengosongkan string5. Objek string1, subskript awal di dalam string (6), dan jumlah karakter
yang akan disambung (nilai balik dari string1.length()
– 6) ketiganya dilewatkan kepada fungsi anggota append.
10.3 Membandingkan string
Kelas string menyediakan beberapa fungsi anggota untuk membandingkan
objek-objek string. Gambar 10.2
mendemonstrasikan kapabilitas perbandingan dari kelas string.
Gambar 10.2 Mendemonstrasikan Kapabilitas
Perbandingan string
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
75
76
77
78
79
80
81
|
// Gambar 10.2: gambar10_02.cpp
// Mendemonstrasikan kapabilitas
perbandingan string.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string string1( "Test fungsi
perbandingan." );
string string2( "Hallo" );
string string3( "Siantar"
);
string string4( string2 );
cout << "string1: "
<< string1 << "\nstring2: " << string2
<< "\nstring3: "
<< string3 << "\nstring4: " << string4
<< "\n\n";
// membandingkan string1 dan string4
if( string1 == string4 )
cout << "string1 ==
string4\n";
else // string1 != string4
{
if( string1 > string4 )
cout << "string1 >
string4\n";
else
// string1 < string4
cout << "string1 <
string4\n";
} // akhir dari else
// Membandingkan string1 dan string2
int hasil = string1.compare( string2 );
if ( hasil == 0 )
cout << "string1.compare(
string2 ) == 0\n";
else // hasil != 0
{
if ( hasil > 0 )
cout << "string1.compare(
string2 ) > 0\n";
else // hasil < 0
cout << "string1.compare(
string2 ) < 0\n";
} // akhir dari else
// membandingkan string1 (elemen 2-5) dan
string3 (elemen 0-5)
hasil = string1.compare( 2, 5, string3, 0, 5 );
if ( hasil == 0 )
cout << "string1.compare( 2,
5, string3, 0, 5 ) == 0\n";
else // hasil != 0
{
if ( hasil > 0 )
cout << "string1.compare(
2, 5, string3, 0, 5 ) > 0\n";
else // hasil < 0
cout << "string1.compare(
2, 5, string3, 0, 5 ) < 0\n";
} // akhir dari else
// membandingkan string2 dan string4
hasil = string4.compare( 0, string2.length(), string2 );
if ( hasil == 0 )
cout << "string4.compare( 0,
string2.length(), "
<< "string2 ) == 0"
<< endl;
else // hasil != 0
{
if ( hasil > 0 )
cout << "string4.compare(
0, string2.length(), "
<< "string2 ) > 0"
<< endl;
else // hasil < 0
cout << "string4.compare(
0, string2.length(), "
<< "string2 ) < 0"
<< endl;
} // akhir dari else
// membandingkan string2 dan string4
hasil = string2.compare( 0, 3, string4 );
if ( hasil == 0 )
cout << "string2.compare( 0,
3, string4 ) == 0" << endl;
else // hasil != 0
{
if ( hasil > 0 )
cout << "string2.compare(
0, 3, string4 ) > 0" << endl;
else // hasil < 0
cout << "string2.compare(
0, 3, string4 ) < 0" << endl;
} // akhir dari else
} // akhir dari main
|
string1:
Test fungsi perbandingan.
string2:
Hallo
string3:
siantar
string4:
Hallo
string1
> string4
string1.compare(
string2 ) > 0
string1.compare(
2, 5, string3, 0, 5 ) > 0
string4.compare(
0, string2.length(), string2 ) == 0
string2.compare(
0, 3, string4 ) < 0
Program mendeklarasikan empat objek string (baris 9-12) dan menampilkannya
masing-masing pada baris 14-15. Baris 18 menguji string1 terhadap string4
untuk ekualitas menggunakan operator ekualitas teroverload. Jika kondisi bernilai true,
maka “string1 = = string4” yang
ditampilkan. Jika kondisi bernilai false,
maka kondisi pada baris 22 akan diuji. Semua fungsi operator ekualitas dan
relasional teroverload pada kelas
string menghasilkan nilai bool.
Bari 29 menggunakan fungsi anggota compare untuk membandingkan string1 dengan string2. Variabel hasil
ditugasi 0 jika kedua objek string
tersebut ekivalen, ditugasi angka positif jika string1 secara leksikografikal lebih besar dari string2, atau ditugasi angka negatif
jika string1 secara leksikografikal
kurang dari string2. Ketika dikatakan
bahwa sebuah objek string secara
leksikografikal kurang dari objek string
lainnya, ini berarti bahwa metode compare
menggunakan nilai-nilai numerik atas karakter tersebut di dalam himpunan
karakter ASCII. Karena string yang
diawali dengan ‘T’ dipandang secara leksikografikal lebih dari string yang diawali dengan ‘H’, maka hasil akan ditugasi nilai yang lebih
besar dari 0, seperti ditegaskan pada keluaran.
Baris 42 membandingkan penggalan dari string1 dengan penggalan dari string3 menggunakan sebuah versi teroverload dari fungsi anggota compare. Dua argumen pertama (2 dan 5)
menspesifiksi subskript awal dan panjang penggalan atas string1 (“st fu”) untuk
dibandingkan dengan string3. Argumen
ketiga adalah string yang akan dibandingkan. Dua argumen terakhir (0 dan 5)
adalah subskript awal dan panjang penggalan dari string yang akan dibandingkan, string3 (“siant”).
Nilai yang akan ditugaskan kepada hasil
adalah lebih dari 0, karena secara leksikografikal penggalan string1 lebih dari penggalan string3.
Baris 55 menggunakan versi teroverload lain dari fungsi compare untuk membandingkan string4 dengan string2. Dua argumen pertama sama, yaitu subskript awal dan panjang
string. Argumen terakhir adalah string
yang akan dibandingkan. Nilai balik yang dihasilkan juga sama, 0 untuk
ekualitas, sebuah angka positif jika string4
secara leksikografikal lebih besar dari string2,
atau sebuah angka negatif jika string4
secara leksikografikal kurang dari dari string2.
Karena dua string yang sedang
dibandingkan identik, hasil ditugasi
dengan nilai 0.
Baris 74 memanggil fungsi anggota compare untuk membandingkan 3 karakter
pertama di dalam string2 dengan string4. Karena “Hal” kurang dari “Hallo”,
nilai negatif ditugaskan kepada hasil.
10.4 Substring
Kelas string menyediakan fungsi anggota substr untuk mengambil substring dari sebuah objek string. Hasil yang didapatkan adalah
sebuah objek string baru yang disalin
dari objek string sumber. Gambar 10.3
mendemonstrasikan substr. Program
mendeklarasikan dan menginisialisasi sebuah objek string pada baris 9. Baris 13 menggunakan fungsi anggota substr untuk mengambil substring dari
objek string1. Argumen pertama menspesifikasi subskript awal dari substring
yang diinginkan; argumen kedua menspesifikasi panjang substring.
Gambar 10.3 Mendemonstasikan Fungsi Anggota substr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// Gambar 10.3: gambar10_03.cpp
// Mendemonstrasikan fungsi anggota substr.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string
string1( "Pesawat mendarat tepat waktu." );
//
mengambil substring "Pesawat" yang dimulai
//
dari subskript 0 dan memuat 7 karakter
cout
<< string1.substr(
0, 7 ) << endl;
} // akhir dari main
|
Pesawat
10.5 Menukar string
Kelas string menyediakan fungsi anggota swap untuk menukar dua objek string.
Gambar 10.4 menukar dua objek string. Baris 9-10 mendeklarasikan dan
menginisialisasi dua objek string,
pertama dan kedua. Setiap objek string
kemudian ditampilkan. Baris 15 menggunakan fungsi anggota swap untuk menukar nilai dari pertama
dan kedua. Dua objek string tersebut ditampilkan kembali
untuk menegaskan bahwa keduanya sudah ditukar. Fungsi anggota swap berguna untuk mengimplementsikan
pengurutan string.
Gambar 10.4 Mendemonstasikan Fungsi Anggota swap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// Gambar 10.4: gambar10_04.cpp
// Menggunakan fungsi swap untuk menukar dua
objek string.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string pertama( "satu" );
string kedua( "dua" );
// menampilkan string
cout << "Sebelum
penukaran:\n pertama: " << pertama
<< "\nkedua: " << kedua;
pertama.swap( kedua ); // menukar string
cout << "\n\nSetelah
penukaran:\n pertama: " << pertama
<< "\nkedua: "
<< kedua << endl;
} // akhir dari main
|
Sebelum penukaran:
pertama: satu
kedua: dua
Setelah penukaran:
pertama: dua
kedua: satu
10.6 Karakteristik string
Kelas string menyediakan beberapa fungsi anggota untuk mengumpulkan
informasi tentang ukuran, panjang, kapasitas, panjang maksimum, dan karaktestik
lainnya dari sebuah objek string.
Ukuran atau panjang sebuah objek string
adalah panjang karakter yang saat ini disimpan di dalam objek string tersebut. Kapasitas sebuah objek string adalah jumlah karakter yang dapat
disimpan di dalam objek tersebut tanpa harus mengalokasikan memori tambahan.
Kapasitas sebuah objek string
sedikitnya sama dengan ukuran saat ini dari string.
Kapasitas persis dari sebuah objek string bergantung pada implementasi. Ukuran
maksimum adalah ukuran terbesar yang mungkin dimiliki oleh sebuah objek string. Jika nilai ini melebihi dari
yang diijinkan, maka eksepsi length_error
akan dilempar. Gambar 10.5 mendemonstrasikan beberapa fungsi anggota dari kelas
string untuk menentukan karakteristik
objek string.
Gambar 10.5 Menggunakan Karakteristik string
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
// Gambar 10.5: gambar10_05.cpp
// Mendemonstrasikan
fungsi anggota yang berkaitan dengan ukuran dan kapasitas.
#include <iostream>
#include <string>
using namespace std;
void tampilStatistik( const string & );
int main()
{
string string1; // string kosong
cout << "Statistik sebelum
masukan:\n" << boolalpha;
tampilStatistik( string1 );
// hanya membaca sepotong string saja
"gadjah" dari "gadjah mada"
cout << "\n\nMasukkan sebuah
string: ";
cin >> string1; // dibasi dengan
karakter spasi putih
cout << "String yang
dimasukkan adalah: " << string1;
cout << "\nStatistik setelah
masukan:\n";
tampilStatistik( string1 );
// membaca "mada"
cin >> string1; // dibatasi dengan
karakter spasi putih
cout << "\n\nSisa string
adalah: " << string1 << endl;
tampilStatistik( string1 );
// menyambung karakter ke string1
string1 += "1234567890abcdefghijklmnopqrstuvwxyz1234567890";
cout << "\n\nstring1 sekarang
adalah: " << string1 << endl;
tampilStatistik( string1 );
// menambahkan 10 elemen ke dalam string1
string1.resize(
string1.length() + 10 );
cout << "\n\nStatistik
setelah pengubahan ukuran menjadi (length + 10):\n";
tampilStatistik( string1 );
cout << endl;
} // akhir dari main
// menampilkan statistik string
void tampilStatistik( const string
&stringRef )
{
cout << "kapasitas: "
<< stringRef.capacity()
<< "\nukuran maks: "
<< stringRef.max_size() << "\nukuran:
" << stringRef.size()
<< "\npanjang: "
<< stringRef.length()
<< "\nkosong: "
<< stringRef.empty();
} // akhir dari tampilStatistik
|
Statistik sebelum masukan:
kapasitas: 0
ukuran maks: 4294967283
ukuran: 0
panjang: 0
kosong: true
Masukkan sebuah string: gadjah mada
String yang dimasukkan adalah: gadjah
Statistik setelah masukan:
kapasitas: 6
ukuran maks: 4294967283
ukuran: 6
panjang: 6
kosong: false
Sisa string adalah: mada
kapasitas: 4
ukuran maks: 4294967283
ukuran: 4
panjang: 4
kosong: false
string1
sekarang adalah: mada1234567890abcdefghijklmnopqrstuvwxyz1234567890
kapasitas:
50
ukuran maks: 4294967283
ukuran:
50
panjang:
50
kosong:
false
Statistik
setelah pengubahan ukuran menjadi (length + 10):
kapasitas:
60
ukuran maks: 4294967283
ukuran: 60
panjang: 60
kosong: false
Program mendeklarasikan string kosong string1 (baris 11) dan melewatkannya
kepada fungsi tampilStatistik (baris
14). Fungsi tampilStatistik (baris
42-48) mengambil sebuah referensi yang menunjuk ke sebuah const string sebagai argumen dan menampilkan kapasitasnya
(menggunakan fungsi anggota capacity),
ukuran maksimum (menggunakan fungsi anggota max_size), ukuran (menggunakan fungsi anggota size),
panjang (menggunakan fungsi anggota length),
dan apakah string kosong atau tidak (menggunakan fungsi anggota empty). Pemanggilan awal terhadap tampilStatistik mengindikasikan bahwa
nilai-nilai awal untuk kapasitas, ukuran, dan panjang dari string1 adalah 0.
Ukuran dan panjang 0 mengindikasikan
bahwa tidak terdapat karakter yang disimpan di dalam string. Karena kapasitas
awal adalah 0, ketika karakter ditempatkan di dalam string1, memori akan dialokasikan untuk mengakomodasi
karakter-karakter baru yang dimasukkan. Ingat bahwa ukuran dan panjang selalu
identik. Pada implementasi ini, ukuran maksimum adalah 4294967283. Objek string1 merupakan string kosong, jadi
fungsi empty memberikan nilai true.
Baris 18 memasukkan sebuah string. Pada
contoh ini, “gadjah mada” dimasukkan.
Karena karakter spasi merupakan pembatas (delimiter), maka hanya “gadjah” yang disimpan di dalam string1 dan “ mada” tertinggal di dalam penyangga masukan. Baris 22 memanggil
fungsi tampilStatistik untuk
menampilkan statistik atas string1.
Perhatikan di dalam keluaran bahwa panjang adalah 6 dan kapasitas adalah 6.
Baris 25 membaca “mada” dari penyangga masukan dan menyimpannya ke dalam string1, sehingga menggantikan “gadjah”.
Baris 27 melewatkan string1
kepada tampilStatistik. Baris 30
menggunakan operator teroverload +=
untuk menyambung string 46-karakter ke dalam string1. Baris 32 melewatkan string1
kepada tampilStatisik. Kapasitas
sekarang bertambah menjadi 50 elemen dan panjang sekarang juga menjadi 50.
Baris 35 menggunakan fungsi anggota resize
untuk menambah panjang string1
sebanyak 10 karakter. Elemen tambahan yang diberikan adalah karakter null.
Keluaran menunjukkan bahwa kapasitas dan penjang sekarang menjadi 60.
10.7 Mencari Substring dan Karakter di
dalam String
Kelas string menyediakan beberapa fungsi anggota bertipe const untuk mencari substring dan
karakter di dalam sebuah objek string.
Gambar 10.6 mendemonstrasikan fungsi find.
String string1 dideklarasikan dan
diinisialisasi pada baris 9. Baris 14 mencoba untuk mencari “malam” di dalam string1 menggunakan fungsi find.
Jika “malam” ditemukan, maka
subskript dari lokasi awal substring tersebut dijadikan nilai balik. Jika tidak
ditemukan, maka nilai balik yang dihasilkan adalah string::npos (sebuah konstanta public
static yang didefinisikan di dalam kelas string). Nilai tersebut dijadikan nilai balik oleh find untuk mengindikasikan bahwa
substring atau karakter yang dicari tidak ditemukan di dalam string.
Gambar 10.6 Menggunakan Fungsi Anggota find
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
// Gambar 10.6: gambar10_06.cpp
// Mendemonstrasikan fungsi anggota find.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string
string1( "noon is 12 pm; midnight is not. " );
int
lokasi;
// mencari "is"
cout << "String awal:\n"
<< string1
<< "\n\n(find) \"is\"
ditemukan pada: " << string1.find( "is" )
<< "\n(rfind) \"is\"
ditemukan pada: " << string1.rfind( "is" );
// mencari 'o' pada lokasi 1
lokasi = string1.find_first_of( "misop" );
cout << "\n\n(find_first_of)
ditemukan '" << string1[ lokasi ]
<< "' dari grup
\"misop\" pada: " << lokasi;
// mencari 'o' pada lokasi 28
lokasi = string1.find_last_of( "misop" );
cout << "\n\n(find_last_of)
ditemukan '" << string1[ lokasi ]
<< "' dari grup
\"misop\" pada: " << lokasi;
// mencari '1' pada lokasi 8
lokasi = string1.find_first_not_of( "noi spm" );
cout << "\n\n(find_first_not_of)
'" << string1[ lokasi ]
<< "' yang tidak dimuat \"noi
spm\" dan ditemukan pada: "
<< lokasi;
// mencari ';' pada lokasi 13
lokasi =
string1.find_first_not_of( "12noi spm" );
cout << "\n\n(find_first_not_of)
'" << string1[ lokasi ]
<< "' yang tidak dimuat
\"12noi spm\" dan "
<< "ditemukan pada:
" << lokasi << endl;
// mencari karakter di dalam string1
lokasi = string1.find_first_not_of(
"noon is 12 pm; midnight is not."
);
cout << "\nfind_first_not_of(\"noon
is 12 pm; midnight is not.\")"
<< " dihasilkan: "
<< lokasi << endl;
} //
akhir dari main
|
String
awal:
noon
is 12 pm; midnight is not.
(find)
"is" ditemukan pada: 5
(rfind)
"is" ditemukan pada: 24
(find_first_of)
ditemukan 'o' dari grup "misop" pada: 1
(find_last_of)
ditemukan 'o' dari grup "misop" pada: 28
(find_first_not_of)
'1' yang tidak dimuat "noi spm" dan ditemukan pada: 8
(find_first_not_of)
'.' yang tidak dimuat "12noi spm" dan ditemukan pada: 13
find_first_not_of("noon
is 12 pm; midnight is not.") dihasilkan: -1
Baris 15 menggunakan fungsi anggota rfind untuk mencari string1 secara mundur ( kanan-ke-kiri). Jika “is” ditemukan, maka lokasi subskript dijadikan nilai balik. Jika
string “is” tidak ditemukan, maka string::npos dijadikan nilai balik.
Baris 18 menggunakan fungsi anggota find_first untuk mencari lokasi
kemunculan pertama dari sembarang karakter di dalam “misop” di dalam string1.
Pencarian ini dilakukan dari awal string1.
Karakter ‘o’ ditemukan pada elemen 1.
Baris 23 menggunakan fungsi anggota find_last_of untuk mencari kemunculan
terakhir sembarang karakter di dalam “misop”
di dalam string1. Pencarian dilakukan
dari akhir string1. Karakter ‘o’ ditemukan pada elemen 28.
Baris 28 menggunakan fungsi anggota find_first_not untuk menemukan karakter
pertama di dalam string1 yang tidak
memuat sembarang karakter di dalam “nio
spm”. Karakter ‘1’ ditemukan pada elemen 8. Pencarian dilakukan dari awal string1.
Baris 34 menggunakan fungsi anggota find_first_not_of untuk menemukan
karakter pertama di dalam string1
yang tidak memuat sembarang karakter di dalam “12nio spm”. Karakter ‘;’ ditemukan pada elemen 12. Pencarian
dilakukan dari awal string1.
Baris 40-41 menggunakan fungsi anggota find_first_not_of untuk menemukan
karakter pertama di dalam string1
yang tidak memuat sembarang karakter di dalam “noon is 12 pm; midnight is not.”. Pada kasus ini, string1 memuat setiap karakter yang
dispesifikasi di dalam argumen string. Karena tidak ditemukan, string::npos (yang memiliki nilai -1
pada kasus ini) dijadikan nilai balik.
10.8 Mengganti Karakter di dalam string
Gambar 10.7 mendemonstrasikan beberapa
fungsi anggota pada kelas string
untuk mengganti dan menghapus karakter. Baris 10-14 mendeklarasikan dan
menginisialisasi string1. Baris 20
menggunakan fungsi anggota erase
untuk menghapus semuanya dari karakter pada posisi 62 sampai akhir string1. Perhatikan bahwa garis-baru
menempati satu karakter di dalam string.
Gambar 10.7 Mendemonstrasikan erase dan replace
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
// Gambar 10.7: gambar10_07.cpp
// Mendemonstrasikan fungsi anggota erase
dan replace.
#include <iostream>
#include <string>
using namespace std;
int main()
{
//
kompiler menyambung semua bagian menjadi satu string
string string1( "Masa kuliah di
tahun 90an adalah masa terindah."
"\nwaktu itu di jogja hampir semua
mahasiswa berjalan kaki"
"\ndan bersepeda. Tidak seperti
sekarang kampus dipenuhi"
"\ndengan emisi kendaraan. Jika
bukan mahasiswa yang sayang"
"\nbumi, lalu siapa lagi yang
punya kesadaran itu?" );
cout << "String awal adalah:\n"
<< string1 << endl << endl;
// menghapus semua karakter dari lokasi 62
// sampai akhir string1
string1.erase( 62 );
// menampilkan string baru
cout << "String awal setelah
dihapus:\n" << string1
<< "\n\nSetelah penggantian
pertama:\n";
int posisi = string1.find( "
" ); // menemukan spasi pertama
// mengganti semua spasi dengan titik
while ( posisi != string::npos )
{
string1.replace( posisi, 1, "." );
posisi = string1.find( " ",
posisi + 1 );
} // akhir dari while
cout << string1 << "\n\nSetelah
penggantian kedua:\n";
posisi = string1.find( "." ); //
mencari titik pertama
// mengganti semua titik dengan dua titik
koma
// PERHATIKAN: ini akan mengganti karakter
while ( posisi != string::npos )
{
string1.replace( posisi, 2, "xxxxx;;yyy", 5, 2 );
posisi = string1.find( ".",
posisi + 1 );
} // akhir dari while
cout << string1 << endl;
} // akhir dari main
|
String awal adalah:
Masa
kuliah di tahun 90an adalah masa terindah.
waktu
itu di j
String
awal setelah dihapus:
Masa
kuliah di tahun 90an adalah masa terindah.
waktu
itu di j
Setelah
penggantian pertama:
Masa.kuliah.di.tahun.90an.adalah.masa.terindah.
waktu.itu.di.j
Setelah
penggantian kedua:
Masa;;uliah;;i;;ahun;;0an;;dalah;;asa;;erindah;;
aktu;;tu;;i;;
Baris 26-33 menggunakan find untuk mencari lokasi kemunculan
karakter spasi. Setiap spasi kemudian diganti dengan sebuah titik dengan memanggil fungsi anggota replace. Fungsi replace memerlukan tiga argumen: subskript karakter dimana
penggantian mulai dilakukan, jumlah karakter yang akan diganti, dan string
pengganti. Fungsi anggota find
menjadikan string::npos menjadi nilai
balik ketika karakter yang dicari tidak ditemukan. Pada baris 32, 1 ditambahkan
kepada posisi untuk melanjutkan
pencarian pada lokasi karakter selanjutnya.
Baris 37-45 menggunakan fungsi find untuk menemukan setiap titik dan
fungsi teroverload replace untuk mengganti setiap titik dan
karakter setelahnya dengan dua titik-koma. Argumen yang dilewatkan kepada versi
replace ini adalah subskript elemen
dimana operasi penggantian mulai dilakukan, jumlah karakter yang akan diganti,
dan string karakter pengganti dimana di dalamnya sebuah substring dipilih untuk
digunakan sebagai karakter-karakter pengganti, elemen di dalam string karakter
dimana penggantian dilakukan, dan jumlah karakter di dalam string karakter yang
digunakan.
10.9 Menyisipkan Karakter ke dalam
string
Kelas string menyediakan beberapa fungsi anggota untuk menyisipkan
karakter ke dalam sebuah string.
Gambar 10.8 mendemonstrasikan kapabilitas fungsi anggota insert.
Program mendeklarasikan,
menginisialisasi, kemudian menampilkan string1,
string2, string3, dan string4.
Baris 19 mengggunakan fungsi anggota insert
untuk menyisipkan isi dari string2 ke
posisi sebelum elemen 10 di dalam string1.
Baris 22 menggunakan insert untuk menyisipkan string4 ke posisi sebelum elemen 3 di
dalam string3. Dua argumen terakhir
menspesifikasi elemen awal dan elemen terakhir dari string4 yang harus disisipkan. Penggunaan string::npos menyebabkan keseluruhan string disisipkan.
Gambar 10.8 Mendemonstrasikan insert
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
// Gambar 10.8: gambar10_08.cpp
// Mendemonstrasikan fungsi anggota insert.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string string1( "permulaan akhir"
);
string string2( "tengah "
);
string string3( "12345678"
);
string string4( "xx" );
cout << "String awal:\nstring1:
" << string1
<< "\nstring2: "
<< string2 << "\nstring3: " << string3
<< "\nstring4: "
<< string4 << "\n\n";
//
menyisipkan "jogja" pada lokasi 10 di dalam string1
string1.insert( 10, string2 );
//
menyisipkan "xx" pada lokasi 3 di dalam string3
string3.insert( 3, string4, 0,
string::npos );
cout << "String setelah
penyisipan:\nstring1: " << string1
<< "\nstring2: "
<< string2 << "\nstring3: " << string3
<< "\nstring4: "
<< string4 << endl;
} // akhir dari main
|
String awal:
string1: permulaan akhir
string2: tengah
string3: 12345678
string4: xx
String setelah penyisipan:
string1: permulaan tengah akhir
string2: tengah
string3: 123xx45678
string4: xx
10.10 Konversi Menjadi char *
Kelas string menyediakan beberapa fungsi untuk mengkonversi objek kelas string menjadi string berbasis pointer
versi-C. Tidak seperti string berbasis pointer, objek string tidak diakhiri dengan karakter null. Fungsi-fungsi konversi
ini berguna ketika fungsi yang diberikan memerlukan string berbasis pointer
sebagai argumen. Gambar 10.9 mendemonstrasikan konversi objek string menjadi string berbasis pointer.
Gambar 10.9 Mengkonversi Menjadi string Versi-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
// Gambar 10.9: gambar10_09.cpp
// Menkonversi menjadi string versi-C.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string string1( "STRINGS" ); // konstruktor string dengan argumen char*
const char *ptr1 = 0; //
menginisialisasi *ptr1
int panjang = string1.length();
char *ptr2 = new char[ panjang
+ 1 ]; // termasuk karakter null
// menyalin karakter dari string1 ke memori
yang dialokasikan
string1.copy( ptr2, panjang, 0 ); // menyalin string1 ke ptr2 char*
ptr2[ panjang ] = '\0'; // menambahkan
karakter null
cout << "string string1 adalah
" << string1
<< "\nstring1 dikonversi
menjadi string versi-C adalah "
<< string1.c_str() << "\nptr1 adalah
";
// menugaskan kepada
pointer ptr1 sebuah const char * yang dijadikan nilai
// balik oleh fungsi
data(). PERHATIKAN: ini penugasan yang berbahaya.
// Jika string1
dimodifikasi, pointer ptr1 dapat
// menjadi
tak-valid.
ptr1 = string1.data();
// menampilkan setiap karakter menggunakan
pointer
for ( int i = 0; i <
panjang; ++i )
cout << *( ptr1 + i ); //
menggunakan aritmatika pointer
cout << "\nptr2 adalah
" << ptr2 << endl;
delete [] ptr2; // membebaskan memori yang dialokasikan secara
dinamis
} // akhir dari main
|
String string1 adalah STRINGS
string1 dikonversei menjadi string versi-C
adalah STRINGS
ptr1 adalah STRINGS
ptr2 adalah STRINGS
Program mendeklarasikan sebuah objek string, sebuah int, dan dua pointer char
(baris 8-12). Objek string1
diinisialisasi dengan “STRINGS”, ptr1 diinisialisasi dengan 0, dan panjang diinisialisasi dengan panjang
dari string1. Memori yang cukup untuk
menampung string berbasis pointer (yang ekivalen dengan objek string1) dialokasikan secara dinamis dan
ditunjuk oleh pointer char, ptr2.
Baris 15 menggunakan fungsi anggota copy untuk menyalin objek string1 ke dalam array char yang ditunjuk oleh ptr2. Baris 16 secara manual menempatkan
karakter null di akhir array yang ditunjuk oleh ptr2.
Baris 20 menggunakan fungsi c_str untuk mendapatkan sebuah pointer const char * yang menunjuk ke string
versi-C dengan konten sama dengan string1.
Pointer tersebut dilewatkan kepada operator penyisipan aliran untuk
ditampilkan.
Baris 26 menugaskan kepada const char * ptr1 sebuah pointer yang
dijadikan nilai balik oleh fungsi anggota data
(dari kelas string). Fungsi anggota
ini menghasilkan nilai balik berupa array karakter versi-C yang tidak diakhiri
dengan karakter null. Jika string1
dimodifikasi (memori dinamis mengubah alamatnya karena pemanggilan fungsi
seperti string1.insert(0, “abcd”);),
maka ptr1 menjadi tak-valid.
Baris 29-30 menggunakan aritmatika
pointer untuk menampilkan array karakter yang ditunjuk oleh ptr1. Pada baris 32-33, string versi-C
yang ditunjuk oleh ptr2 ditampilkan
dan memori yang dialokasikan untuk ptr2
dibebaskan untuk menghindari kebocoran memori.
10.11 Iterator
Kelas string menyediakan beberapa iterator untuk penjelajahan maju dan
mundur atas objek string. Semua
iterator tersebut menyediakan akses terhadap karakter secara individual dengan
sintaks yang sama dengan operasi pointer. Rentang iterator tidak secara
otomatis diperiksa. Gambar 10.10 mendemonstrasikan iterator.
Gambar 10.9 Mengkonversi Menjadi string Versi-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
// Gambar 10.10: gambar10_10.cpp
// Menggunakan sebuah iterator untuk
menampilkan sebuah string.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string
string1( "Menguji iterator" );
string::const_iterator
iterator1 = string1.begin();
cout
<< "string1 = " << string1
<< "\n(Menggunakan iterator
iterator1) string1 adalah: ";
//
menjelajahi string
while
( iterator1 != string1.end() )
{
cout
<< *iterator1; // mendereferensi iterator untuk
mendapatkan char
++iterator1;
// menginkremen iterator ke char berikutnya
} //
akhir dari while
cout
<< endl;
} // akhir dari main
|
string1 = Menguji iterator
(Menggunakan
iterator iterator1) string1 adalah: Menguji
iterator
Baris 9-10 mendeklarasikan string string1 dan string::const_iterator iterator1. const_iterator merupakan sebuah iterator yang tidak bisa
memodifikasi objek string, pada kasus
ini hanya digunakan untuk menjelajahi string.
Iterator iterator1 diinisialisasi
dengan awal dari string1 menggunakan
fungsi anggota begin. Ada dua versi begin, satu yang menjadikan nilai balik
sebuah iterator yang beriterasi melalui non-const
string dan satu lagi yang menjadikan
nilai balik sebuah const_iterator
yang beriterasi melalui const_string.
Baris 16-20 menggunakan iterator1 untuk menjelajahi string1. Fungsi anggota end dari kelas string menjadikan nilai balik sebuah iterator (atau const_iterator)
untuk posisi satu elemen melewati elemen terakhir dari string1. Setiap elemen ditampilkan dengan mendereferensi iterator
seperti mendereferensi sebuah pointer.
Kesimpulan
Tidak seperti char * (string
versi C), string tidak harus diakhiri dengan karakter null. Panjang sebuah string dapat dicari menggunakan fungsi
anggota length dan menggunakan fungsi
anggota size. Operator subskript [ ]
dapat digunakan bersama string untuk
mengakses dan memodifikasi karakter
individual. Seperti string versi-C, string
mempunyai subskript pertama 0 dan subskript terakhir length() – 1.
Kelas string juga menyediakan
versi teroverload dari fungsi anggota
assign yang menyalin sejumlah
karakter.
Kelas string menyediakan
beberapa fungsi anggota untuk membandingkan objek-objek string.
Kelas string menyediakan fungsi
anggota substr untuk mengambil
substring dari sebuah objek string.
Hasil yang didapatkan adalah sebuah objek string
baru yang disalin dari objek string
sumber.
Kelas string menyediakan fungsi
anggota swap untuk menukar dua objek string.
Kelas string menyediakan
beberapa fungsi anggota untuk mengumpulkan informasi tentang ukuran, panjang,
kapasitas, panjang maksimum, dan karaktestik lainnya dari sebuah objek string. Ukuran atau panjang sebuah objek
string adalah panjang karakter yang
saat ini disimpan di dalam objek string
tersebut. Kapasitas sebuah objek string
adalah jumlah karakter yang dapat disimpan di dalam objek tersebut tanpa harus
mengalokasikan memori tambahan. Kapasitas sebuah objek string sedikitnya sama dengan ukuran saat ini dari string. Kapasitas persis dari sebuah
objek string bergantung pada implementasi. Ukuran maksimum adalah ukuran
terbesar yang mungkin dimiliki oleh sebuah objek string. Jika nilai ini melebihi dari yang diijinkan, maka eksepsi length_error akan dilempar.
Kelas string menyediakan
beberapa fungsi anggota insert untuk menyisipkan karakter ke dalam
sebuah string.
Latihan
1)
Tuliskan sebuah program yang
memasukkan satu kelimat dan yang menghitung jumlah palindrome di dalamnya.
Palindrome adalah sebuah kata, yang bila dibaca maju dan mundur akan memberikan
hasil sama. Sebagai contoh, pohon
bukan sebuah palindrome, tetapi katak
adalah sebuah palindrome.
2)
Tulislah sebuah program yang
menghitung jumlah konsonan di dalam suatu kalimat. Tampilkan frekuensi
kemunculan setiap konsonan.
3)
Tulislah sebuah program yang
menyisipkan karakter-karakter “******” di tengah-tengah sebuah objek string.
4)
Tulislah sebuah program yang
menghapus “yang” dan “YANG” dari suatu objek string.
5)
Tulislah sebuah program yang
membaca sebaris kalimat dan menampilkannya secara mundur. Gunakan iterator pada
solusi Anda.
No comments:
Post a Comment