Stringovi

U C++ stringovi se implementiraju na dva načina.  Definicijom stringa kao niz karaktera koji završava null karakterom. Null karakter je bajt čiji su svi bitovi nule. Ovaj bajt se označava specijalnim simbolom „“.  Ako niz karaktera na kraju ne sadrži null karakter,  niz ne predstavlja string.

Pr:

char niz[6]={‘H’,’E’,’L’,’O’,“}

Drugi pristup za inicijalizaciju stringa koristi string konstantu, koja je niz karaktera pod znacima navoda

char niz[]=“Heloo!“

Programer  ne smešta null karakter na kraju string konstante, C++ kompajler automatski dodaje “ „, na kraju stringa kada inicijalizuje niz. Prilikom deklaracije se ne navodi broj karaktera koji čine string.

Pr.

Napravi program koji unosi naziv proizvoda i njegovu cenu i prikazuje unos na monitoru računara?

Rešenje.

#include <iostream>
#include <cstring>
using namespace std;

/* run this program using the console pauser or add your own getch, system(„pause“) or input loop */

int main(int argc, char** argv)
{
char text[100];
float cena;
cout<<„Unesi Naziv?“<<endl;
cin>> text;
cout<<“ Unesi cenu?“<<endl;
cin>> cena;
cout<<“ Naziv proizvoda je „<<text<<“ a cena „<< cena<<endl;
return 0;
}

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.“;

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;
}

Unos kompletnog reda teksta sa tastature

string 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.

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 spajanje, „+“.
#include <iostream>
#include <string>

using namespace std;

int main()
{
string puno_ime_i_prezime;
string ime = „Pero“;
string prezime = „Peric“;

puno_ime_i_prezime = ime +”  “+ prezime;

cout << puno_ime_i_prezime << endl;

return 0;
}
Nakon izvršavanja programa promenljiva s će sadržati string „Pero Peric“.

Pr2. 

Koristeći klasu string spoji dva stringa u jedan?

Rešenje.

#include <iostream>
#include <string>
using namespace std;
int main()
{
string a, b;
a = "prvi";
b = "drugi";
a = a + " " + b;
cout << a << endl; //stampa 'prva druga'
b = b + b;
cout << b << endl; //stampa'drugadruga';
return 0;
}

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;
}

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”;
}

Funkcije koje omogućavaju rada sa tekstualnim nizovima

  • strlen(char[] niz)– vrednost funkcije je dužina niza bez znak null
  • strcpy(char[] destinacija, char[] izvor)– kopira tekstualni niz sa izvora do destinacije uključujući i znak null
  • strncpy(char[] destinacija, char[] izvor, int N)– kopira najviše N znakova od izvora do destinacije, znak null se kopira samo ako spada u N znakova, inače se uvodi sam. Napomena: niz destinacija mora da bude dovoljno velik da bi primio sve znakove sa izvora
  • strcmp(char[] prvi, char[] drugi)– upoređuje niz prvi i niz drugi i kao vrednost daje 0 ako su nizovi jednaki
  • strncmp(char[] prvi, char[] drugi, int N)– upoređuje N znakova niza prvi i drugi i ako su isti dodeljuje vrednost 0
  • strcat(char[] prvi, char[] drugi)– dodaje nizu prvi niz drugi, niz prvi treba da bude dovoljno velik da prihvati i znakove niza drugi
  • strncat(char[] prvi, char[] drugi, int N)– nadovezije prvih N znakova niza drugi nizu prvi
Primer 3.
Kako se koristi funkcije klase string?

Rešenje.

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
/* run this program using the console pauser or add your own getch, system(„pause“) or input loop */

int main(int argc, char** argv) {
char a[]=“prvi niz“;
char b[]=“drugi niz“;
char c[] = „tekst“;
char d[] = „tekst novi“;
cout << strlen(d) << endl; //stampa 8
cout << strlen(c) << endl; //stampa  ‘5’
char t[100];
strcpy(t, „Neka vrednost“); //t=“Neka vrednost“
cout<<t<<endl;
strcpy(t, „Neshto drugo“); //t=“Neshto drugo“
cout<<t<<endl;
strcpy(t, a); //t=“prvi niz“
cout<<t<<endl;
strncpy(t, b, 5); //t=“drugi niz “ (ne kopira “)
cout<<t<<endl;
t[5] = ‘ ‘; //t=“drugi“
strcat(t, b); //t=“drugi  niz“
cout << t << endl; //pechati ‘drugi drugi niza’
cout << strcmp(t, a) << endl; //pechati ‘1’
cout << strcmp(c, d) << endl; //pechati ‘0’
return 0; return 0;
}

devc

Pr.4
Unesi sadržaj  znakovnog niza i prikaži isti?
Rešenje.
#include <iostream>
#include <cstring>
using namespace std;/* run this program using the console pauser or add your own getch, system(„pause“) or input loop */

int main(int argc, char** argv)
{
string niz[10];
int i,n;
cout<<“ Koliko reci ima vas niz_“;
cin>>n;
for (i=0;i<n;i++)
{
cout<<“ unesi  „<<i+1<< “ element niya“<<endl;
cin>> niz[i];
}
for (i=0;i<n;i++)
{
cout<< niz[i]<<“ „;
}
return 0;
}
slika slika

Pr5.

Unesite ime, prezime, datum rođenja i tekuću godinu; Naravite program koji izračunava godine starosti za osobu čije podatke ste uneli?

Rešenje:

#include<iostream>

#include<string>

using namespace std;

int main()

{

            int god, god1, god2;

            string ime;

            cout<<„Upisi svoje ime:“;

            cin>>ime;

            cout<<endl<<„Upisi godinu svog rodjenja:“;

            cin>>god1;

            cout<<endl<<„Koja je godina sada? „;

            cin>>god2;

            god=god2-god1;

            cout<<endl<<ime<<“ ima „<<god<<“ godina.“<<endl;

            return 0;

}

slika

Stringovi

String- jednodimenzionalni niz tipa char koji ne mora zauzimati sve elemente niza u kome se čuva. Da bi se znal gde se u nizu završava string dopisuje mu se završni ili NULL znak – „, koji je sastavni deo stringa.

Pr.

char poruka[10], *pokc;

poruka[0]=’z’;

poruka[1]=’d’;

poruka[2]=’r’

poruka[4]=’a’;

poruka[5]=’v’;

poruka[5]=’o’;

pokc=poruka;

while(*pokc!=“)

putchar(*pokc++);

Pored inicijalizacije „znak po znak“, strin se može inicijalizirati i string konstantom-niz znakova između znaka navodnika. Znaci između navodnika se plus završni znak se registruju u niz susednih memorijskih lokacija.  String konstanta „C“, nije ista sa znakovnom konstantom „C“, jer string konstanta sadrži i završni znak, “ „.

Stringovi se mogu inicijalizirati koriščenjem string konstante bilo da se čuvaju u statičkim, spoljašnim ili automatskim nzovima.

pr.

statik char s[]=“bah“

static char s[]={‘I’,’B’,’M’,“}(ako se izostavi znak  “, onda nije reč o stringu već o nizu znakova)

s- pokazivac na nulti element niza

s==&s[0], *s==’I’, *(s+1)=s[1]==’B’