$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \newcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Stringovi 2

  • Dozvoljeno polaganje
  • Lekcije
  • Nema
  • Teo
  • 7/25/2015

Tip podataka - char

 

U lekciji "Stringovi 1" smo posmatrali niske (niz) karaktera, no postoji i tip podataka koji predstavlja pojedinačne karaktere i zove se char. Za dodelu vrednosti promenljivoj tipa char koriste se jednostruki znaci navoda:

char karakter = 'e' ;

 

Obrati pažnju da se kod stringova koriste dvostruki znaci navoda:

string mojString = "tekst";

cout << "Ovo je primer gde se koriste dvostruki znaci navoda.";

 

Možeš da probaš u programu da napišeš umesto sa dvostrukim znacima navoda sa samo sa jednostrukim

string mojString = 'tekst';

pa da vidiš koju ćeš grešku dobiti ;)

 

Pristup pojedinačnom karakteru stringa

 

Stringovi su nizovi karaktera, međutim stringovi su dosta specifični i neki programski jezici ih posmatraju kao posebne tipove. Svakom elementu stringa možemo pristupiti kao kod bilo kog niza. Naravno, moguće je menjati elemente stringa kao uobičajeno menjanje elemenata stringa, prvi karakter stringa nalazi se na poziciji 0.

 

U sledećoj tabeli prikazan je jedan string sa pozicijama svakog karaktera stringa:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

B

a

b

b

l

e

b

e

e

 

k

u

r

s

 

Pogledajmo sledeći primer:

#include <iostream>

#include <string>

 

using namespace std;  

 

int main()

{

string s = "Babblebee kurs omogucava studentima da unaprede svoje znanje iz programiranja";

cout << s << endl;

 

s[1] = 'u';

cout << s << endl;

 

 

for(int i = 0; i < s.length(); i++)

{

cout<< s[i];

}

 

cout<< endl;

 

return 0;

}

 

Standardni izlaz posle pokretanja navedenog programa izgleda ovako:

Babblebee kurs omogucava studentima da unaprede svoje znanje iz programiranja

Bubblebee kurs omogucava studentima da unaprede svoje znanje iz programiranja

Bubblebee kurs omogucava studentima da unaprede svoje znanje iz programiranja

 

Obrati pažnju da pošto je s string tj. niz karaktera da je s[1] zapravo tipa char i da zato u liniji programa:

s[1] = 'u';

koristimo jednostruke znake navoda.

 

Napišimo sad program koji u unetom stringu menja sve samoglasnike u samoglasnik 'i' kao u reklami za Cipiripi:

 

Disclaimer: autori kursa ne podržavaju konzumaciju proizvoda na bazi šećera, ovaj primer je iskorišćen kao pogodan za ilustraciju ove lekcije.

 

 

#include <iostream>

#include <string>

 

using namespace std;  

 

int main()

{

string s = "Bubblebee kurs omogucava studentima da unaprede svoje znanje iz programiranja";

cout << s << endl;

 

for(int i = 0; i < s.length(); i++)

{

if (s[i] == 'a' || s[i] == 'e' || s[i] == 'o' || s[i] == 'u')

{

s[i] = 'i';

}

else if (s[i] == 'A' || s[i] == 'E' || s[i] == 'O' || s[i] == 'U')

{

s[i] = 'I';

}

}

 

cout << s << endl;

 

return 0;

}

 

Standardni izlaz posle pokretanja navedenog programa izgleda ovako:

Bubblebee kurs omogucava studentima da unaprede svoje znanje iz programiranja

Bibblibii kirs imigicivi stidintimi di inipridi sviji zninji iz prigrimirinji

 

 

U biblioteci “string” se nalaze korisne funkcije za rad sa stringovima u C++-u. Ovde ćemo navesti neke od njih.

Funkcije za pretragu u stringu

Funkcija find se moze koristiti za pretragu pozicije karaktera u stringu, ili za poziciju podstringa. Na primer, mozemo da nadjemo poziciju prvog razmaka u stringu na sledeci nacin:

pozicija = str.find (' ');

Ako string ne sadrzi nijedan znak razmaka, rezultat koji vraca funkcija find ce biti jednaka vrednosti string::npos (specijalna vrednost koja oznacava da nije pozicija u pitanju - non-position eng.). U primeru koji sledi pokazujemo kako se string::npos  moze kombinovati sa funkcijom find:

if (str.find (' ') != string::npos)

{

    cout  << "String sadrzi barem jedan razmak!" << endl;

}

else

{

    cout  << "String ne sadrzi nijedan razmak!" << endl;

}

Funkcija find vraca poziciju prvog pojavljivanja datog karaktera (ili ako tog karaktera nema u stringu vratice vrednost string::npos). Takodje postoji i slicna funkcija rfind - r oznacava eng. reverse tj. pretragu od pozadi; drugim recima rfind nalazi poziciju poslednje pojave datog karaktera, ili vrednost string::npos.

 

Funkcije find i rfind se mogu koristiti i za pronalazenje podstringa; sledeci fragment programskog koda se moze iskoristiti da se utvrdi da li dati string sadrzi rec "je":

string text;

getline (cin, text);

 

if (text.find ("je") != string::npos)

{

    // ...

Za oba slucaja pretrage (na nivou pojedinacnog karaktera ili na nivou podstringa), moze se podesiti pocetna pozicija pretrage; u tom slucaju, funkcija find ce pronaci poziciju prvog pojavljivanja trazenog podstringa ili karaktera posle te pocetne pozicije; funkcija rfind vraca poziciju poslednjeg pojavljivanja pre pozicije koja je navedena - na ovo se moze posmatrati kao na prvo pojavljivanje ako se krecemo od zadate pozicije ka nultoj poziciji stringa (dakle krecuci se unazad). Zahtev koji treba da ispuni ovaj opcioni parametar je da mora biti validna/postojeca pozicija u okviru stringa, sto znaci da njena vrednost mora biti izmedju 0 i duzinaStringa1.

 

Sledeci primer vrsi pretragu svakog pojavljivanja stringa "macka" u datom stringu i broji koliko puta se taj podstring pojavljuje:

string ulaz;

int i = 0;

int pojavaMacke = 0;

getline(cin, ulaz, '\n');

 

i = ulaz.find("macka", 0);

while (i != string::npos)

{

pojavaMacke = pojavaMacke + 1;

i = ulaz.find("macka", i+5);

}

cout<<pojavaMacke;

 

Podstringovi

Mozemo izdvojiti deo stringa funkcijom substr. Ova funkcija ne uklanja podstring iz originalnog stringa; umesto toga, ona kreira novi string koji sadrzi odredjeni podstring datog originalnog stringa. Trazeni podstring je odredjen pocetnom pozicijom i brojem karaktera tj. duzinom, uzimajuci u obzir da je pozicija pocetnog karaktera stringa 0. Sledeci primer dodeljuje promenljivoj fragment sekvencu od 5 karaktera pocevsi od pozicije 5 iz promenljive text:

string text = "De si brate, kako je, sta ima?";

string fragment = text.substr (5, 5);

Promenljiva fragment sadrzi string "brate", dok promenljiva text ostaje nepromenjena.

Ako izostavimo drugi parametar, onda ce funkcija substr vratiti podstring pocevsi od navedene pocetne pozicije pa sve do kraja stringa. Na primer:

string text = "De si brate?";

string podstring = text.substr(4);

dodeljuje string "i brate?" promenljivoj podstring.

Prvi parametar mora da oznacava validnu/postojecu poziciju u okviru stringa (kao sto je slucaj kod funkcije find), ili ce ponasanje funkcije biti nedefinisano. Drugi parametar, u kombinaciji sa prvim, moze uzrokovati da se premasi duzina stringa. U tom slucaju, podstring koji se vraca ce sadrzati sve karaktere od specificirane pocetne pozicije pa do kraja stringa, kao sto je prikazano u sledecem primeru:

string text = "012345";

string fragment = text.substr (2,3); // ok

fragment = text.substr (6,2); // Nije ok (1)

fragment = text.substr (3,10); // ok (2)

(1) Ova naredba ima nedefinisano ponasanje, jer pocetna pozicija se ne nalazi u okviru datog stringa.

(2) Vraca sve raspolozive karaktere pocevsi od pozicije 3. U ovom odredjenom slucaju, ova naredba ima isti efekat kao i naredba fragment = text.substr (3,3).

 

Brisanje i umetanje podstringova

Pored izdvajanja podstringova, mozemo i da modifikujemo dati string, tako sto odredjeni podstring mozemo da zamenimo sa drugim stringom, ili tako sto mozemo da izbrisemo ceo podstring.

Funkcija erase ima dva ulazna parametra, koja odredjuju podstring (to su pocetna pozicija i broj karaktera podstringa) koji se brise iz stringa, kao u sledecem primeru:

string text = "Ovo je test";

text.erase (0,7);

Nakon izvrsavanja naredbe text.erase(0,7), string text sadrzi "test" - podstring sa pocetnom pozicijom 0 ('O' u "Ovo je ") i koji ima 7 karaktera (ukljucujuci i razmake) se brise iz stringa, string se skracuje (dobra analogija sa ovom operacijom je koriscenje Delete tastera u editorima teksta).

Umesto brisanja podstringa, podstring mozemo zameniti i nekim drugim stringom, kao u sledecem primeru:

string text = "Ovo je test";

text.replace (4,2,"nije");

Nakon izvrsavanja naredbe text.replace(4,2,"nije"), string text sadrzi "Ovo nije test". Primeti da smo podstring od dva karaktera zamenili sa stringom od 4 karaktera. Ovo je sve dozvoljeno; podstring se moze zameniti sa stringom proizvoljne duzine. Funkcija replace je slicna insert opciji (eng. "insert mode") u tekst editorima.