04 - C++ string klasa
C++ string klasa
  • Tip/klasa string
  • Indeks stringa i Operator indeksiranja
  • Spajanje stringova
  • Poređenje stringova
  • Učitavanje stringova
  • Kreiranje stringova
  • C++ string metode za rad sa tekstom
04
Tip/klasa string
String prestavlja sekvencu/niz karaktera

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

  • length() - vraća broj karaktera u stringu .
  • size() - radi isto kao i length().
  • at(index) - vraća karakter koji se nalazi na odgovarajućem indeksu u stringu.

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 = "";
Indeks stringa i Operator indeksiranja
Funkcija at(index) i operator indeksiranja [index] se koriste za pristup i manipulaciju karaktera stringa na poziciji index

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.


Slika-4.1: Karakterima objekta tipa string može biti pristupano korišćenjem indeksa [5]

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.

Spajanje stringova
C++ obezbeđuje operator + za spajanje dva stringa, kao i operator +=

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";
Poređenje stringova
Možete da koristite operatore poređenja ==, !=, <, <=, >, >= da bi poredili dva stringa

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
Učitavanje stringova
Funkcija getline() obezbeđuje pouzdano učitavanje stringova sa korisničkog ulaza

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);
Kreiranje stringova
Najefikasniji način da se kreira sadržaj objekta klase string je primenom konstruktora

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++ string metode za rad sa tekstom
C++ klasa sadrži veliki broj metoda koje olakšavaju rad sa tekstualnim podacima

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:

  • name.size() - Nalaženje dužine tekstualne promenljive
  • name.empty() - Test na prazne tekstualne promenljive : vraća TRUE ili FALSE
  • name.compare() - Poređenje tekstualnih promenljivih
  • name2.assign(name1) - Kopiranje jednog stringa u drugi (ili jednostavno operator =)
  • name.find() - Nalaženje dela tekstualne promenljive
  • name.erase,name.replace() - Brisanje / zamena
  • name1.append(name2) - Dodavanje tj. “sabiranje” stringova
  • name1.insert(position, name2) - Insertovanje jednog stringa u drugi od zadate pozicije.