RAD SA TEKSTUALNIM PODACIMA - STRINGOVIMA
Sadržaj lekcije: Stringovi u C++
Dobrodošli na lekciju posvećenu stringovima u jeziku C++! U ovoj lekciji ćemo detaljno objasniti šta su stringovi, kako se koriste, kao i koje su njihove prednosti i mane. Upoznaćete se sa osnovnim konceptima, metodama manipulacije stringovima, konverzijom između C++ stringova i C-stilskih nizova, te načinima dinamičke alokacije memorije za rad sa tekstom. Takođe, pokrićemo i moderne tehnike, kao što su upotreba std::string i naprednih funkcija za obradu teksta.
Uvod u stringove u C++
Stringovi u C++ predstavljaju sekvence karaktera koje se koriste za skladištenje i manipulaciju tekstualnim podacima. Postoje dva osnovna pristupa radu sa stringovima u C++:
-
C-stil stringovi: Ovo su nizovi karaktera koji se završavaju nul-terminatorom (
'\0'
). Iako su tradicionalno korišćeni, C-stil stringovi zahtevaju ručno upravljanje memorijom i mogu biti podložni greškama kao što su prekoračenje bafera i neispravno rukovanje završetkom stringa. -
C++ string (std::string): Ovo je klasa iz standardne biblioteke C++ (header
<string>
) koja omogućava rad sa stringovima na sigurniji i intuitivniji način. std::string automatski upravlja memorijom, nudi bogat skup funkcija za manipulaciju tekstom (kao što su konkatenacija, poređenje, pretraga i modifikacija) i integraciju sa ostalim komponentama standardne biblioteke.
U modernom C++ programiranju, preporučuje se korišćenje std::string umesto tradicionalnih C-stil stringova zbog veće sigurnosti, lakšeg održavanja koda i bogatijih mogućnosti manipulacije tekstom.
Ova lekcija će vas upoznati sa osnovnim operacijama nad stringovima, demonstrirati kako se kreiraju, modifikuju i upoređuju stringovi, te ukazati na najbolje prakse u radu sa tekstualnim podacima u C++-u.
Podaci tipa char u C++
Tip podataka char se koristi za skladištenje pojedinačnih karaktera i predstavlja celobrojni tip koji zauzima 8 bita memorije. U suštini, char čuva numeričku vrednost (najčešće ASCII kod) karaktera, što omogućava lako pretvaranje između numeričkih i simboličkih vrednosti.
U nastavku je prikazan primer koji demonstrira osnovnu upotrebu tipa char – kako se čuva karakter, a zatim ispisuje njegova numerička vrednost zajedno sa samim karakterom pomoću funkcije printf.
// Primer upotrebe tipa char
char c = 'A';
printf("%d, %c", c, c);
// Na izlazu će se prikazati: 65, A
U ovom primeru, promenljiva char c je inicijalizovana sa karakterom 'A'. Funkcija printf koristi format konverzije "%d" za ispis celobrojne vrednosti (ASCII kod), a "%c" za ispis samog karaktera. Kao rezultat, na izlazu se dobija: 65, A, gde broj 65 predstavlja numeričku vrednost karaktera 'A'.
char c=’A’;
printf(“%d, %c “,c,c);
Na izlazu će se prikazati: 65 A
Dakle prvo se prikazuje ceo broj koji predstavlja kod karaktera A, a zatim sam karakter. Za prikaz koda se koristi format konverzije „%d“(za cele brojeve) a za prikaz karaktera „%c“.
C-stil. Niz karaktera
Nastao je unutar jezika C i nastavlja da bude podržan unutar C ++. Ovaj niz je zapravo jednodimenzionalan niz karaktera koji je prekinut nultim karakterom '\ 0'.
char text[6] = {'P', 'o', 'z', 'd', 'r', , 'a', 'v' '\0'}; može i ovako char text[]=“Pozdrav“; |
|
Tekstualni podaci u c++
using namespace std;
string s = "Ovo je neki tekst.";
std::string s = " Ovo je neki tekst.";
Unos stringova sa standarnog ulaza
Za učitavanje stringa do razmaka koristi se cin naredba iz datoteke iostream.
Za ispisivanje stringa na ekran koristi se cout naredba iz datoteke iostream.
Primer koda:
#include <iostream>
#include <string>
int main(){
string ime, prezime;
cin >> ime >> prezime;
cout << ime << " " << prezime << endl;
return 0;
}
Unos kompletnog reda teksta sa tastature
getline( cin,text);
Drugi argument je ime string promenljive u koju želiš da smestiš uneti tekst.
Funkcija getline čita celu liniju sve dok korisnik ne pritisne [Enter]. Ovo je korisno kada ulazni string sadrži razmake.
Funkcija getline, je deo standardnog zaglavlja <string> pa ga je potrebno uključiti, sa naredbom include:
Razdvajanje reči iz unetog teksta sa tastature
int main()
{
string rec="";
int n = 0; //brojac ciklusa
getline(cin,text);//Čita red teksta i smešta u promenljivu tekst
stringstream T=stringstream(text);//String promenljivu smešta u tok podataka sstream
/*Čita iz toka podataka deo teksta do sledećeg blanko karaktera i smešta u promenljivu "rec"*/
while(getline(T,rec,' '))
{
n++;//broji reci(cikluse)
cout<<"U tekstu ima " << n << " reči " << endl;
return 0;
Tekst je mogao biti učitan i direktno sa standardnog ulaza, da bi se izbeglo dodavanje sstream podatka. To bi sada bilo:
int main()
{
int n = 0; //brojac ciklusa
/*Čita sa standardnog ulaza(cin) deo teksta do sledećeg blanko karaktera i smešta u promenljivu "rec"*/
while(getline(cin,rec,' '))
{
n++;//broji reci(cikluse)
cout<<"U tekstu ima " << n << " reči " << endl;
return 0;
Testirajte svoj kod u editoru ispod!
Osnovne operacije sa stringovima
Dodela stringa
Možemo da dodelimo vrednost jednog stringa drugom.
string str1 = "Zdravo!";
string str2;
str2 = str1;
Jedan string može da se inicijalizuje drugim kao u sledećem primeru.
string str1 = "Zdravo!";
string str2 = str1;
"Spajanje" dva stringa
Dva stringa (ili više njih) se mogu spojiti koristeći operaciju sabiranja + kao što smo radili sabirajući brojeve.
#include <iostream>
#include <string>
using namespace std;
int main() {
string puno_ime_i_prezime;
string ime = "Nenad";
string prezime = "Milenković";
puno_ime_i_prezime = ime + " " + prezime;
cout << puno_ime_i_prezime << endl;
return 0;
}
Nakon izvršavanja programa, promenljiva puno_ime_i_prezime će sadržati string "Nenad Milenković".
Dužina stringa
Za određivanje dužine stringa koristi se funkcija length iz biblioteke string.
string str1;
str1.length()
Primer programa:
#include <iostream>
#include <string>
using namespace std;
int main() {
string naziv_grada;
int duzina_teksta;
cout << "Unesi naziv grada: ";
getline(cin, naziv_grada);
duzina_teksta = naziv_grada.length() - 1; // Oduzimamo 1 zbog razmaka
cout << endl << endl;
cout << "Grad: " << naziv_grada << endl;
cout << "Naziv grada sadrži " << duzina_teksta << " karaktera." << endl;
return 0;
}
Primer ispisa ovog programa:
Unesi naziv grada: Banatski Karlovac
Grad: Banatski Karlovac
Naziv grada sadrži 16 karaktera.
Poređenje stringova
Za poređenje stringova koristimo logičke operatore >, <, ==, !=, >=, <= pomoću kojih možemo porediti stringove po leksikografskom redosledu, tj. po abecedi. Na primer, 'c' je ispred 'd' po leksikografskom redosledu. Takođe, 'aabc' je ispred 'abc' jer se poređenje ne vrši po dužini stringa već po leksikografskom redosledu.
Primer 1:
bool b;
b = ("abak" == "abak"); // true
b = ("Ab" < "AA"); // false, jer malo 'b' je veće po leksikografskom redosledu od velikog slova 'A'
Primer 2: Ispitivanje tačnosti lozinke
Primer programa koji ispituje da li unesena lozinka odgovara @n0nimus_@n0nimus:
#include <iostream>
#include <string>
using namespace std;
int main() {
string lozinka;
cin >> lozinka;
if (lozinka == "@n0nimus_@n0nimus") {
cout << "Tačna je lozinka" << endl;
} else {
cout << "Netačna lozinka";
}
return 0;
}
Ispitivanje znakova pomoću funkcija iz zaglavlja < cctype >
Ove funkcije omogućavaju:
- Proveru da li je karakter slovo (isalpha)
- Proveru da li je karakter cifra (isdigit)
- Razlikovanje malih i velikih slova (islower, isupper)
- Proveru belih znakova (isspace)
- Konverziju između malih i velikih slova (tolower, toupper), itd.
U nastavku ćemo videti primere upotrebe ovih funkcija i kako ih možemo koristiti u svakodnevnom programiranju u C++.
Neke funkcije iz zaglavlja "cctype"
- isalnum(ch), Da li je ch slovo ili cifra?
- isalpha(ch), Da li je ch slovo?
- islower(ch), Da li je ch malo slovo?
- isupper(ch), Da li je ch veliko slovo?
- isdigit(ch), Da li je ch decimalna cifra?
- isspace(ch), Da li je ch beli znak (razmak, tab, novi red)?
- ispunct(ch), Da li je ch znak interpunkcije?
- iscntrl(ch), Da li je ch upravljački znak (poput backspace-a ili enter-a)?
- tolower(ch), Pretvara veliko slovo ch u malo.
- toupper(ch), Pretvara malo slovo ch u veliko.
Primer upotrebe funkcija iz zaglavlja <cctype>
Napišite C++ program koji omogućava korisniku da unese jedan karakter sa tastature, a zatim ispita i ispiše njegove osobine koristeći funkcije iz zaglavlja <cctype>.
Program treba da ispita sledeće karakteristike unetog karaktera:
- Da li je slovo ili cifra (isalnum)
- Da li je slovo (isalpha)
- Da li je cifra (isdigit)
- Da li je malo slovo (islower) i, ako jeste, prikaže njegovo veliko slovo
- Da li je veliko slovo (isupper) i, ako jeste, prikaže njegovo malo slovo
- Da li je beli znak (razmak, tab, novi red) (isspace)
- Da li je znak interpunkcije (ispunct)
- Da li je upravljački znak (iscntrl)
#include <cctype> // Zaglavlje sa funkcijama za ispitivanje znakova
using namespace std;
int main() {
cout << "Unesite karakter: ";
cin >> ch;
// Provera da li je karakter slovo ili cifra
if (isalnum(ch)) {
// Provera da li je karakter slovo
if (isalpha(ch)) {
// Provera da li je karakter cifra
if (isdigit(ch)) {
// Provera da li je karakter malo slovo
if (islower(ch)) {
cout << "Veliko slovo: " << (char)toupper(ch) << '\n';
// Provera da li je karakter veliko slovo
if (isupper(ch)) {
cout << "Malo slovo: " << (char)tolower(ch) << '\n';
// Provera da li je karakter beli znak (razmak, tab, novi red)
if (isspace(ch)) {
// Provera da li je karakter znak interpunkcije
if (ispunct(ch)) {
// Provera da li je karakter upravljački znak
if (iscntrl(ch)) {
return 0;
Funkcije za pretragu unutar stringa
Za pretragu pozicije karaktera ili dela teksta u okviru većeg stringa koristi se funkcija find().
Na primer, da bi se našlo pojavljivanje "je" unutar zadatog teksta:
string str1 = "Posmatrano u hipersvemirskim razmerama, galaksije predstavljaju tek tačkice - i tako je širom Vaseljene. Mi još nismo otišli ni do jedne tuđe galaksije, niti je, koliko znamo, neka inteligentna vrsta iz neke druge galaksije došla među nas; međutim, jednog dana i tome može doći kraj.";
int pozicija, pozicija2, pozicija3;
pozicija = str1.find("je"); // npr. 48
pozicija2 = str1.find("je", 66); // npr. 17
pozicija3 = str1.rfind("je"); // npr. 33
Funkcija find() vraća poziciju prvog pojavljivanja datog karaktera ili podstringa, a ukoliko ga ne pronađe, vraća vrednost string::npos.
Slično, funkcija rfind() (reverse find) pretražuje string od pozadine i vraća poziciju poslednjeg pojavljivanja datog karaktera ili podstringa.
Funkcija rfind() vraća poziciju poslednjeg pojavljivanja pre zadate pozicije, odnosno pronalazi prvo pojavljivanje kada se krećemo unazad.
Podstringovi
Koristimo funkciju substr iz zaglavlja <string>.
Primer 1:
string text = " Posmatrano u hipersvemirskim razmerama, galaksije predstavljaju tek tačkice.";
string deoTeksta = text.substr(3, 11);
Promenljiva deoTeksta sadrži string "smatrano", dok promenljiva text ostaje nepromenjena. Prvi parametar označava početnu poziciju podstringa (pozicije počinju od 0), a drugi parametar predstavlja dužinu podstringa.
Ako izostavimo drugi parametar, funkcija substr vraća podstring počevši od navedene početne pozicije do kraja stringa. Na primer:
string text = " galaksije predstavljaju tek tačkice?";
string podstring = text.substr(4);
Prvi parametar mora da označava validnu postojeću poziciju unutar stringa, inače će ponašanje funkcije biti nedefinisano. Drugi parametar, u kombinaciji sa prvim, može dovesti do toga da se premaši dužina stringa. U tom slučaju, funkcija substr vraća sve karaktere od zadate početne pozicije do kraja stringa. Na primer:
string text = "012345";
string fragment = text.substr(2, 3); // OK
fragment = text.substr(6, 2); // Nedefinisano ponašanje - početna pozicija van opsega
fragment = text.substr(3, 10); // Vraća sve raspoložive karaktere od pozicije 3
U ovom slučaju, naredba fragment = text.substr(3,10); ima isti efekat kao i fragment = text.substr(3,3); ukoliko od pozicije 3 nema više od 3 karaktera.
Brisanje i umetanje podstringova
Funkcija erase ima dva ulazna parametra, koja određuju podstring (to su početna pozicija i broj karaktera podstringa) koji se briše iz stringa, kao u sledećem primeru:
string text = "Ovo je test";
text.erase(0, 7);
Nakon izvršavanja naredbe text.erase(0,7), string text sadrži "test". Podstring sa početnom pozicijom 0 ('O' u "Ovo je ") i koji ima 7 karaktera (uključujući i razmake) se briše iz stringa, te se string skraćuje – dobra analogija je korišćenje tastera [Delete] u editorima teksta.
Umesto brisanja podstringa, podstring se može zameniti nekim drugim stringom, kao u sledećem primeru:
string text = "Ovo je test";
text.replace(4, 2, "nije");
Nakon izvršavanja naredbe text.replace(4,2,"nije"), string text sadrži "Ovo nije test". Primeti da smo podstring od dva karaktera zamenili stringom od četiri karaktera, što je dozvoljeno. Funkcija replace je slična opciji insert u tekst editorima.
Podela stringova pomoću separatora ","
Zadatak je da se tekst podeli na dva dela dela levo i desno od zareza.
Npr. ako se na ulazu učita npr adresa: "Masarikova 18, Beograd"
Na izlazu treba da se ispiše u dva reda:
Masarikova 18
Beograd
Rešenje: Zadatak se može rešiti tako što se prvo učita red teksta pomoću metode getline:
getline(cin, redTeksta);
Zatim se odredi pozicija karaktera "," u redu teksta pomoću funkcije find_first_of, koja kao parametar prima separator (u ovom slučaju ",") i vraća poziciju prvog pojavljivanja separatora ili, ako ga ne pronađe, vrednost -1:
sepInd = redTeksta.find_first_of(",");
Na kraju, izdvajaju se dva podstringa pomoću metode substr, koristeći prethodno određenu poziciju:
str1 = redTeksta.substr(0, sepInd);
str2 = redTeksta.substr(sepInd + 1);
Kompletan kod:
#include <iostream>
#include <string>
using namespace std;
int main() {
string redTeksta;
string punk = ",";
string str1, str2;
int sepInd;
cout << "Unesi red teksta: " << endl;
getline(cin, redTeksta);
sepInd = redTeksta.find_first_of(punk);
str1 = redTeksta.substr(0, sepInd);
str2 = redTeksta.substr(sepInd + 1);
cout << str1 << endl;
cout << str2 << endl;
return 0;
}
Napredne operacije sa std::string
u C++
Klasa std::string u C++ nudi širok spektar metoda za naprednu manipulaciju tekstualnim podacima. Pored osnovnih operacija kao što su pretraga, izdvajanje i zamena podstringova, postoje i dodatne tehnike koje omogućavaju fleksibilnije i efikasnije rukovanje stringovima. U nastavku su predstavljene neke od naprednijih operacija:
Konkatenacija stringova
Konkatenacija, odnosno spajanje stringova, može se izvršiti korišćenjem operatora + ili metode append(). Ovo omogućava jednostavno spajanje više tekstualnih vrednosti.
Primer:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1 = "Pozdrav, ";
string s2 = "svete!";
string rezultat = s1 + s2; // Spajanje stringova korišćenjem operatora +
cout << rezultat << endl;
return 0;
}
Umetanje podstringova
Funkcija insert() omogućava umetanje jednog stringa u drugi na određenoj poziciji, što je korisno za dinamičko modifikovanje teksta.
Primer:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "Dobro došli!";
s.insert(6, "svet "); // Umetanje "svet " na poziciju 6
cout << s << endl;
return 0;
}
Promena veličine slova
Korišćenjem funkcije std::transform iz <algorithm> i funkcija iz <cctype>, string se može konvertovati u velika ili mala slova.
Primer:
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;
int main() {
string s = "Dobrodošli u C++";
transform(s.begin(), s.end(), s.begin(), ::toupper);
cout << s << endl; // Ispisuje "DOBRODOŠLI U C++"
return 0;
}
Tokenizacija stringa
Podela stringa na više delova korišćenjem određenog separatora se može ostvariti kombinacijom metoda find() i substr(). Ovo je korisno za parsiranje ulaznih podataka.
Primer:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "Marko,Ana,Petar,Jovana";
size_t pos;
string token;
while ((pos = s.find(',')) != string::npos) {
token = s.substr(0, pos);
cout << token << endl;
s.erase(0, pos + 1);
}
cout << s << endl; // Ispisuje poslednji token
return 0;
}
Implementacijom ovih naprednih operacija, rad sa std::string postaje fleksibilniji i efikasniji, a programeri mogu prilagoditi svoje aplikacije zahtevima složenijih manipulacija nad tekstom.
Prethodno
|< Dvodimenzioni dinamički nizovi u c++ |
Sledeće
Pokazivači u C++ >| |
Srodni članci
Nizovi-primeri
Petlje u programskom jeziku JAVA
Sortiranje nizova
Operatori u C/C++ jeziku