RAD SA TEKSTUALNIM PODACIMA - STRINGOVIMA
Prethodno
|< Petlje u programskom jeziku C/C++ |
Sledeće
Dvodimenzionalni nizovi - matrice >| |
Tip podataka char
To je zapravo celobrojni tip koji sadrži 8 bita memorije. Uglavnom se koristi za smeštanje kodova karaktera
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“.
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“; |
|
Detaljnije o stringovima u jeziku C pročitajte na web strani: C Stringovi
Tekstualni podaci u jeziku c++
U jeziku C++ postoji tip podataka string koji sadrži tekst. On se koristi kao i svi ostali tipovi, te se neka promenljiva tipa string deklariše na sledeći način. To zapravo predstavlja objekat klase string.
using namespace std;
string s = "Ovo je neki tekst.";
std::string s = " Ovo je neki tekst.";
using namespace std;
string s = "Ovo je neki tekst.";
std::string s = " Ovo je neki tekst.";
Unos stringa sa tastature
· 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;
}
· 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
string text;
getline( cin,text);
getline( cin,text);
Prvi argument funkcije getline je cin, koji kaže odakle nam dolazi tekst (u ovom slučaju sa konzole, to jest tastature).
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:
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:
#include < string >;
Razdvajanje reči iz unetog teksta sa tastature
Za učitavanje reda teksta možemo koristiti funkciju getline(), ali ako koristimo varijantu ove funkcije sa 3. parametrom, koji predstavlja delimiter za razdvajanje i ako stavimo blanko karakter za razdvajanje, možemo odmah izdvojiti reči iz teksta, na sledeći način:
#include < iostream>;
#include < string >;
#include < sstream>;
int main()
{
string text;
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,' '))
{
cout<<"U tekstu ima " << n << " reči " << endl;
return 0;
}
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,' '))
{
cout << rec << endl;
n++;//broji reci(cikluse)
}n++;//broji reci(cikluse)
cout<<"U tekstu ima " << n << " reči " << endl;
return 0;
U prethodnom primeru se prvo učitava red teksta i smešta u promenljivu text, tipa "string" , a zatim se uvede tok(stream engl.) podataka "sstream" i string prebaci u taj tok podataka. Zatim se kroz while petlju, koristi funkcija getline(), sa 3 parametra(prvi je tok kao izvor podataka, drugi je string promenljiva kao odredište i treći je karakter, u ovom slučaju space karakter kao granica do koje će tekst biti učitan iz celog početno učitanog teksta). To znači da će biti učitana reč po reč iz teksta sve dok funkcija getline() ne vrati podatak string::npos, što znači da je tekst iz stream-a pročitan do kraja.
Tekst je mogao biti učitan i direktno sa standardnog ulaza, da bi se izbeglo dodavanje sstream podatka. To bi sada bilo:
Tekst je mogao biti učitan i direktno sa standardnog ulaza, da bi se izbeglo dodavanje sstream podatka. To bi sada bilo:
#include < iostream>;
#include < string >;
int main()
{
string rec="";
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,' '))
{
cout<<"U tekstu ima " << n << " reči " << endl;
return 0;
}
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,' '))
{
cout << rec << endl;
n++;//broji reci(cikluse)
}n++;//broji reci(cikluse)
cout<<"U tekstu ima " << n << " reči " << endl;
return 0;
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;
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 s će sadržati string "Nenad Milenković".
#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 s ć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 sadrzi " << duzina_teksta << " karaktera." << endl;
return 0;
}
Primer ispisa ovog programa:
Unesi naziv grada: Banatski Karlovac
Grad: Ibro Banatski Karlovac
Naziv grada sadrzi 16 karaktera.
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 sadrzi " << duzina_teksta << " karaktera." << endl;
return 0;
}
Primer ispisa ovog programa:
Unesi naziv grada: Banatski Karlovac
Grad: Ibro Banatski Karlovac
Naziv grada sadrzi 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.
Npr ‘c’ je ispred ‘d’ po leksikografskom redosledu. Dok je ‘aabc’ 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: Ispitati tačnost lozinke @n0nimus_@n0nimus.
string lozinka;
cin>> lozinka;
if(lozinka == “@n0nimus_@n0nimus”)
{
cout<< “Tačna je lozinka”<<endl;
}
else{
cout<<”Netačna lozinka”;
}
Npr ‘c’ je ispred ‘d’ po leksikografskom redosledu. Dok je ‘aabc’ 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: Ispitati tačnost lozinke @n0nimus_@n0nimus.
string lozinka;
cin>> lozinka;
if(lozinka == “@n0nimus_@n0nimus”)
{
cout<< “Tačna je lozinka”<<endl;
}
else{
cout<<”Netačna lozinka”;
}
Funkcije za pretragu u stringu
Za pretragu pozicije karaktera ili nekog dela teksta u okviru većeg teksta koristimo find()
Npr da bi našli 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');//48
pozicija2 = str1.find(‘je',66);//17
pozicija3 = str1.rfind(‘je');//33
Funkcija find vraća poziciju prvog pojavljivanja datog karaktera (ili ako tog karaktera nema u stringu vratiće vrednost string::npos).
Takođe postoji i slična funkcija rfind (eng. reverse, pretraga od pozadi). Funkcija rfind nalazi poziciju poslednje pojave datog karaktera, ili vrednost string::npos.
Funkcija rfind vraća poziciju poslednjeg pojavljivanja pre pozicije koja je navedena. Može se reći da traži prvo pojavljivanje ako se krećemo od zadate pozicije ka nultoj poziciji stringa (dakle krećući se unazad).
Npr da bi našli 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');//48
pozicija2 = str1.find(‘je',66);//17
pozicija3 = str1.rfind(‘je');//33
Funkcija find vraća poziciju prvog pojavljivanja datog karaktera (ili ako tog karaktera nema u stringu vratiće vrednost string::npos).
Takođe postoji i slična funkcija rfind (eng. reverse, pretraga od pozadi). Funkcija rfind nalazi poziciju poslednje pojave datog karaktera, ili vrednost string::npos.
Funkcija rfind vraća poziciju poslednjeg pojavljivanja pre pozicije koja je navedena. Može se reći da traži prvo pojavljivanje ako se krećemo od zadate pozicije ka nultoj poziciji stringa (dakle krećući se unazad).
Podstringovi
Koristimo funkciju substring iz zaglavlja string
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 je početna pozicija podstringa i treba imati u vidu da pozicije počinju od 0, a ne od 1. Drugi parametar predstavlja dužinu podstringa.
Ako izostavimo drugi parametar, onda će funkcija substr vratiti podstring počevši od navedene početne pozicije pa sve do kraja stringa. Na primer, sledeći blok koda dodeljuje string "ksije predstavljaju tek tačkice?" promenljivoj podstring.
string text = " galaksije predstavljaju tek tačkice?";
string podstring = text.substr(4);
Prvi parametar mora da označava validnu postojeću poziciju u okviru stringa (kao sto je slučaj kod funkcije find), ili će ponašanje funkcije biti nedefinisano. Drugi parametar, u kombinaciji sa prvim, može uzrokovati da se premaši dužina stringa. U tom slučaju, podstring koji se vraća, sadržaće sve karaktere od specificirane početne pozicije pa do kraja stringa, kao što je prikazano u sledećem 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 ponašanje jer se početna pozicija ne nalazi u okviru datog stringa.
(2) Vraća sve raspoložive karaktere počevši od pozicije 3. U ovom određenom slučaju, ova naredba ima isti efekat kao i naredba fragment = text.substr(3,3).
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 je početna pozicija podstringa i treba imati u vidu da pozicije počinju od 0, a ne od 1. Drugi parametar predstavlja dužinu podstringa.
Ako izostavimo drugi parametar, onda će funkcija substr vratiti podstring počevši od navedene početne pozicije pa sve do kraja stringa. Na primer, sledeći blok koda dodeljuje string "ksije predstavljaju tek tačkice?" promenljivoj podstring.
string text = " galaksije predstavljaju tek tačkice?";
string podstring = text.substr(4);
Prvi parametar mora da označava validnu postojeću poziciju u okviru stringa (kao sto je slučaj kod funkcije find), ili će ponašanje funkcije biti nedefinisano. Drugi parametar, u kombinaciji sa prvim, može uzrokovati da se premaši dužina stringa. U tom slučaju, podstring koji se vraća, sadržaće sve karaktere od specificirane početne pozicije pa do kraja stringa, kao što je prikazano u sledećem 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 ponašanje jer se početna pozicija ne nalazi u okviru datog stringa.
(2) Vraća sve raspoložive karaktere počevši od pozicije 3. U ovom određenom slučaju, ova naredba ima isti efekat kao i naredba fragment = text.substr(3,3).
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 sadrzi "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, i string se skraćuje (dobra analogija sa ovom operacijom je korišćenje [Delete] tastera u editorima teksta).
Umesto brisanja podstringa, podstring možemo zameniti i 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 4 karaktera. Ovo je sve dozvoljeno. Podstring se može zameniti sa stringom proizvoljne dužine. Funkcija replace je slična insert opciji (eng. "insert mode") u tekst editorima.
string text = "Ovo je test";
text.erase(0,7);
Nakon izvršavanja naredbe text.erase(0,7), string text sadrzi "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, i string se skraćuje (dobra analogija sa ovom operacijom je korišćenje [Delete] tastera u editorima teksta).
Umesto brisanja podstringa, podstring možemo zameniti i 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 4 karaktera. Ovo je sve dozvoljeno. Podstring se može zameniti sa stringom proizvoljne dužine. Funkcija replace je slična insert opciji (eng. "insert mode") u tekst editorima.
Podela stringa pomoću separatora ","
Pretpostavimo da se sa standardnog ulaza učita jedan red teksta u kome u tekstu postoji ",".
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
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 bi se mogao rešiti, tako što se učita prvo 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 to je ",", a vraća poziciju prvog pojavljivanja separatora ili ako ne nađe onda vrednost -1.
sepInd=redTeksta.find_first_of(",");
Na kraju se izdvajaju dva podstringa sa metodom substring, gde se koristi prethodno određena pozicija:
str1=redTeksta.substr(0,sepInd);
str2=redTeksta.substr(sepInd+1);
Kompletan kod:
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 to je ",", a vraća poziciju prvog pojavljivanja separatora ili ako ne nađe onda vrednost -1.
sepInd=redTeksta.find_first_of(",");
Na kraju se izdvajaju dva podstringa sa metodom substring, gde se koristi prethodno određena pozicija:
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: ";
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;
}
#include <string>
using namespace std;
int main()
{
string redTeksta;
string punk=",";
string str1,str2;
int sepInd;
cout << "Unesi red teksta: ";
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;
}
Prethodno
|< Petlje u programskom jeziku C/C++ |
Sledeće
Dvodimenzionalni nizovi - matrice >| |
Srodni članci
Stringovi-primeri
Nizovi-primeri
Petlje u programskom jeziku JAVA
Sortiranje nizova
Operatori u C/C++ jeziku
Nizovi-primeri
Petlje u programskom jeziku JAVA
Sortiranje nizova
Operatori u C/C++ jeziku