Tip char predstavlja samo jedan karakter. Da bi predstavili niz karaktera u C++-u možete da koristite tip podatka pod nazivom string. Pogledajmo sledeći primer:
string message = "Programming is fun";
Tip string je poznat kao objektni tip. Ovde message predstavlja objekat tipa string čiji je sadržaj Programming is fun .
string je klasa koja je definisana u heder fajlu <string>. Stoga je neophodno uključiti ovaj fajl u program da bi klasa string mogla biti korišćena. Neke od najbitnijih funkcija klase string koje ćemo za sada koristiti su
Znamo da funkcije članice klase string mogu biti pozvane jedino od objekata, tj instance klase string. Na primer, možete da pozovete funkciju size() klase string da bi dobili veličinu tekstualnog objekta, odnosno funkciju at(index) da dobijete informaciju o karakteru na određenom indeksu, kao što je prikazano u sledećem kodu:
string message = "ABCD"; cout << message.length() << endl; cout << message.at(0) << endl; string s = "Bottom"; cout << s.length() << endl; cout << s.at(1) << endl;
Poziv funkcije message.length() vraća vrednost 4 a poziv funkcije message.at(0) vraća karakter A . Poziv funkcije s.length() vraća vrednost 6 a poziv s.at(1) vraća karater o .
Napomena Podrazumeva se, ako nije drugačije navedeno, da se string inicijalizuje kao prazan string, tj, string koji ne sadrži karaktere "". Stoga, sledeća dva iskaza imaju isti efekat:
string s; string s = "";
Funkcija s.at(index) vraća odgovarajući karakter stringa s, gde indeks ide od 0 do s.length()–1. Na primer, funkcija message.at(0) vraća karakter W, kao što je prikazano na Slici 4.1. Primetiti da indeks prvog karaktera stringa ima vrednost 0.
C++ obezbeđuje korišćenje operatora indeksiranja [ ] za pristup karakterima na odgovarajućoj lokaciji primenom stringName[index]. Možete da koristite ovu sintaksu da biste pristupili karakterima odnosno menjali karaktere u stringu. Na primer, sledeći kod postavlja novi karakter P u polje stringa sa indeksom 0 korišćenjem s[0] = ’P’ i prikazuje ga na ekranu.
string s = "ABCD"; s[0] = 'P'; cout << s[0] << endl;
Upozorenje
Pokušaj da se pristupi karakteru stringa s čiji je indeks izvan opsega je uobičajena programerska greška. Da biste ovo izbegli, osigurajte da indeks koji koristite nije veći od s.length() – 1. Na primer, s.at(s.length()) ili s[s.length()] će izazvati grešku.
C++ obezbeđuje operator + za spajanje dva stringa. Naredba prikazana u nastavku, na primer, spaja stringove s1 i s2 u string s3:
string s3 = s1 + s2;
Za spajanje sa postojećim stringom može biti korišćen i operator +=. Na primer, sledeći kod dodaje string "and programming is fun" na string "Welcome to C++" objekta message.
message += " and programming is fun";
Stoga, nova vrednost stringa message je "Welcome to C++ and programming is fun" . Takođe možete da spojite jedan karakter sa stringom, na primer,
string s = "ABC"; s += 'D';
Stoga, novo s ima vrednost "ABCD".
Upozorenje
Nije dozvoljeno spojiti dva string literala. Sledeći kod, na primer, nije korektan:
string cites = "London" + "Paris";
Međutim, sledeći kod je korektan, pošto on spaja string s sa literalom "London" a onda se novi string spaja sa literalom "Paris" .
string s = "New York"; string cites = s + "London" + "Paris";
Takođe možete da koristite operatore poređenja ==, !=, <, <=, >, >= da bi izvršili poređenje stringova. Ovo se vrši poređenjem njima odgovarajućih karaktera, jedan po jedan, sa leva na desno. Na primer,
string s1 = "ABC"; string s2 = "ABE"; cout << (s1 == s2) << endl; // Izlaz je 0 (tj. false) cout << (s1 != s2) << endl; // Izlaz je 1 (tj. true) cout << (s1 > s2) << endl; // Izlaz je 0 (tj. false) cout << (s1 >= s2) << endl; // Izlaz je 0 (tj. false) cout << (s1 < s2) << endl; // Izlaz je 1 (tj. true) cout << (s1 <= s2) << endl; // Izlaz je 1 (tj. true)
Razmotrimo ocenu izraza s1 > s2. Prva dva karaktera (A vs A) stringova s1 se s2 se porede. Pošto su karakteri jednaki, upoređuju se sledeća dva karaktera (B vs B). Pošto su i ovi karakteri jednaki, konačno se upoređuju treći karakteri (C vs E). Pošto je karakter C manji od karaktera E, rezultat poređenja je 0.
U nastavku je još jedan primer poređenja stringova:
string s1 = "abc"; string s2 = "ABC"; string s3 = "abcdef"; ... bool flag1 = ( s1 < s2 ); // flag1 = false bool flag2 = ( s2 < s3 ); // flag2 = true
String može biti učitan sa tastature korišćenjem objekta cin ali je njegovo korišćenje limitirano zbog načina na koji radi sa prazninama (space karakterima). Analizirajmo sledeći segment koda koji vrši učitavanje stringova:
cout << "Unesite ime: "; cin >> a_string;
Pretpostavimo da je prilikom unosa ukucan sledeći podatak (Dane Mitic ):
Unesite ime: Dane Mitic
Nakon unosa, string promenljiva a_string će imati vrednost "Dane" , jer operator >> radi pod pretpostavkom da uneta praznina označava kraj stringa.
Stoga je često bolje koristiti funkciju getline():
getline(cin, s, delimitCharacter)
Funkcija zaustavlja čitanje karaktera kada naiđe na razdelni karakter (npr \n, \t, itd). Razdelni karakter se čita ali se ne dodeljuje stringu s. Treći argument delimitCharacter podrazumevano ima vrednost (’\n’).
Na primer, ako umesto prethodne linije koda:
cin >> a_string;
napišemo sledeći izraz:
cin.getline(a_string,80);
korisniku će biti omogućeno da unese reč od 79 karaktera uključujući praznine, i cela ta rečenica će biti dodeljena promenljivoj a_string.
U slučaju da ne navedemo using namespace std; funkcija se poziva kao:
std::getline (std::cin,name);
tj. imali bi smo sledeći primer:
#include <iostream>
#include <string>
void main ()
{
std::string name;
std::cout << "Unesite vase ime i prezime: ";
std::getline (std::cin,name);
std::cout << "Zdravo, " << name << "!\n";
}
U slučaju da radimo sa nizom karaktera umesto tipom string, oblik funkcije getline() koju primenjujemo je:
char char_array[80]; cin.getline(char_array,80);
Možete da koristite C-string funkcije za manipulaciju u procesiranje stringova ali je klasa string jednostavnija za korišćenje. Procesiranje C-stringova zahteva da programer poznaje kako su karakteri smešteni u nizu karaktera. Korišćenjem klase string programer je oslobođen znanja o implementaciji klase.
Imali smo prilike da vidimo da se stringovi veoma jednostavno kreiraju korišćenjem sintakse:
string s = "Dobro dosli na C++";
Ovaj iskaz nije efikasan jer zahteva dva koraka. On prvo kreira objekat tipa string koji je u stvari string literal a tek onda ga kopira u objekat s. Bolji način je da se string kreira primenom konstruktora, na sledeći način:
string s("Dobro dosli na C++");
Naravno, imate mogućnost da kreirate prazan string korišćenjem konstruktora bez argumenata:
string s;
Takođe možete da kreirate string od C stringa korišćenjem odgovarajućeg konstruktora klase string primenom sledećeg koda:
char s1[] = "Dobro jutro"; string s(s1);
Ovde s1 predstavlja C-string a s je string objekat.
U nastavku su još neki primeri inicijalizacije stringova korišćenjem konstruktora:
string s1; // s1 = "" string s2( "abcdef" ); // s2 = "abcdef“ string s3( s2 ); // s3 = "abcdef" string s4( s2, 1 ); // s4 = "bcdef" string s5( s2, 3, 2 ); // s5 = "de" string s6( 10, '-' ); // s6 = "----------"
C++ klasa string obuhvata metode koje znatno olakšavaju rad sa tekstovima. Da bi se koristile ove metode, treba samo dodati ime metode posle imena string promenljive, kao i tačku. Npr. metoda size() vraća kao rezultat ukupan broj znakova i razmaka u okviru neke tekstualne promenljive string. Neki string može biti ispražnjen ako mu se zada prazan string sa samo dva dupla navoda, i pri tome ne sme biti nikakav prostor između ova dva znaka navoda. U nastavku su date metode koje se mogu koristiti za manipulisanje tekstom:
