Title: Prelucrarea sirurilor de caractere
1 Prelucrarea sirurilor de caractere
- Programarea calculatoarelor si limbaje de
programare II - Capitolul 11
2Obiective
- Folosirea clasei string din biblioteca standard
C pentru tratarea sirurilor de caractere ca
obiecte - Întelegerea modului în care se realizeaza diverse
operatii asupra obiectelor de tip string - Folosirea iteratorilor string
- Realizarea operatiilor de intrare si iesire în
memorie cu string-uri
3Introducere
- Clasa template basic_string
- Ofera operatii tipice pentru prelucrare sirurilor
de caractere copierea, cautarea etc. - Definitia acestui template si toate celelalte
functionalitati sunt definite în namespace std - În namespace std se gaseste si declaratia
- typedef basic_stringltchargt string
4Introducere
- Constructori pentru crearea obiectelor de tip
string - string s1("Hello")
- string s1(8, x)
- Obiectele de tip string nu trebuie sa contina
caracterul NULL pe ultima pozitie - Clasa string mai dispune de un constructor
implicit si de un constructor de copiere
5Sumar
- Asignarea si concatenarea string-urilor
- Subsiruri
- Caracteristicile obiectelor string
- Gasirea caracterelor într-un string
- Înlocuirea caracterelor dintr-un string
- Inserarea caracterelor într-un string
- Iteratori
- Procesarea stream-urilor string
6Asignarea si concatenarea string-urilor
- ...
- include ltstringgt
- using stdstring
- int main()
-
- string s1("cat"), s2, s3
- s2 s1
- s3.assign(s1)
- cout ltlt "s1 " ltlt s1 ltlt "\ns2 " ltlt s2
- ltlt "\ns3 " ltlt s3 ltlt "\n\n"
- ...
-
Pentru a putea folosi clasa string trebuie inclus
în program fisierul header ltstringgt
Operatii de asignare
s1 cat s2 cat s3 cat
7Asignarea si concatenarea string-urilor
- ...
- int main()
-
- ...
- //folosirea operatorului
- s20 s32 'r'
- cout ltlt "Dupa modificarea lui s2 si s3\n"
- ltlt "s1 " ltlt s1 ltlt "\ns2 " ltlt s2 ltlt
"\ns3 " - //functia membra at()
- int len s3.length()
- for(int x 0 x lt len x)
- cout ltlt s3.at(x)
- ...
-
Dupa modificarea lui s2 si s3 s1 cat s2
rat s3 car
8Asignarea si concatenarea string-urilor
- ...
- int main()
-
- ...
- //concatenarea
- string s4(s1 "apult"), s5
- s3 "pet"
- s1.append("acomb")
-
- s5.append(s1, 4, s1.size())
- cout ltlt "\n\nDupa concatenare\n" ltlt "s1 " ltlt
s1 - ltlt "\ns2 " ltlt s2 ltlt "\ns3 " ltlt s3
- ltlt "\ns4 " ltlt s4 ltlt "\ns5 " ltlt s5 ltlt
endl -
Se creeaza cuvantul "catapult"
Se creeaza cuvantul "carpet"
Se creeaza cuvantul "catacomb"
Dupa concatenare s1 catacomb s2 rat s3
carpet s4 catapult s5 comb
9Sumar
- Asignarea si concatenarea string-urilor
- Subsiruri
- Caracteristicile obiectelor string
- Gasirea caracterelor într-un string
- Înlocuirea caracterelor dintr-un string
- Inserarea caracterelor într-un string
- Iteratori
- Procesarea stream-urilor string
10Subsiruri
- ...
- include ltstringgt
- using stdstring
- int main()
-
- string s("The airplane flew away.")
- cout ltlt s.substr(7, 5) ltlt endl
-
- return 0
-
Întoarce subsirul "plane" care începe la pozitia
7 si are 5 elemente
plane
11Sumar
- Asignarea si concatenarea string-urilor
- Subsiruri
- Caracteristicile obiectelor string
- Gasirea caracterelor într-un string
- Înlocuirea caracterelor dintr-un string
- Inserarea caracterelor într-un string
- Iteratori
- Procesarea stream-urilor string
12Caracteristicile obiectelor string
- Clasa string are functii care dau informatii,
între altele, despre - lungimea length(), size()
- lungimea maxima max_size()
- capacitatea sirului capacity()
- Lungimea unui string este numarul de caractere
stocate la un moment dat în obiect - Capacitatea este numarul total de elemente care
pot fi stocate fara cresterea memoriei alocate
sirului - Lungimea maxima este cea mai mare dimensiune
posibila a unui obiect de tip string
13Caracteristicile obiectelor string
- ...
- int main ()
-
- string s
- cout ltlt "Statisticile inainte de input\n"
- printStats(s)
- ...
-
- void printStats(const string str)
-
- cout ltlt "capacitatea " ltlt str.capacity()
- ltlt "\nlungimea maxima " ltlt str.max_size()
- ltlt "\nlungimea " ltlt str.size()
- ltlt "\nsir vid? " ltlt (str.empty() ? "da"
"nu") -
Statisticile inainte de input capacitatea
0 lungimea maxima 1073741820 lungimea 0 sir
vid? da
14Caracteristicile obiectelor string
- ...
- int main ()
-
- ...
- cout ltlt "\n\nIntroduceti un sir de caractere
" - cin gtgt s
- cout ltlt "Sirul introdus este " ltlt s
-
- cout ltlt "\nStatisticile dupa input\n"
- printStats(s)
- ...
Introduceti un sir de caractere tomato
soup Sirul introdus este tomato Statisticile
dupa input capacitatea 6 lungimea maxima
1073741820 lungimea 6 sir vid? nu
15Caracteristicile obiectelor string
- ...
- int main ()
-
- ...
- s.resize(s.length()10)
- cout ltlt "\n\nStatisticile dupa resize cu
(length10)\n" - printStats(s)
- cout ltlt endl
Statisticile dupa resize cu (length10) capacitat
ea 16 lungimea maxima 1073741820 lungimea
16 sir vid? nu
16Sumar
- Asignarea si concatenarea string-urilor
- Subsiruri
- Caracteristicile obiectelor string
- Gasirea caracterelor într-un string
- Înlocuirea caracterelor dintr-un string
- Inserarea caracterelor într-un string
- Iteratori
- Procesarea stream-urilor string
17Gasirea caracterelor într-un string
- ...
- int main()
-
- //compilatorul concateneaza toate sirurile
- //intr-un singur string literal
- string s("Valorile dintr-un subarbore stang"
- "\nsunt mai mici decat valoarea din"
- "\nnodul parinte si valorile din"
- "\norice subarbore drept sunt mai
mari" - "\ndecat valorile din nodul parinte")
-
- cout ltlt "Sirul original\n" ltlt s
- ltlt "\n\n(find) \"subarbore\" a fost gasit
la " - ltlt s.find("subarbore")
- ltlt "\n(rfind) \"subarbore\" a fost gasit
la " - ltlt s.rfind("subarbore")
- ...
-
Gasirea cuvantului "subarbore"
(find) "subarbore" a fost gasit la 18 (rfind)
"subarbore" a fost gasit la 103
18Gasirea caracterelor într-un string
- ...
- int main()
-
- ...
- //gasirea literei 'p'
- cout ltlt "\n(find_first_of) caracter din
\"qpxz\" la " - ltlt s.find_first_of("qpxz")
- ltlt "\n(find_last_of) caracter din \"qpxz\"
la " - ltlt s.find_last_of("qpxz")
- ...
-
find_first_of gaseste prima aparitie în s a
oricaruia dintre caracterele care formeaza sirul
"qpxz"
find_larst_of gaseste ultima aparitie în s a
oricaruia dintre caracterele care formeaza sirul
"qpxz", cautarea începând cu ultima pozitie din
sirul s
((find_first_of) caracter din "qpxz" la
73 (find_last_of) caracter din "qpxz" la 158
19Gasirea caracterelor într-un string
- ...
- int main()
-
- ...
- //gasirea caracterului '-'
- cout ltlt "\n(find_first_not_of) primul caracter
care\n" - ltlt " nu este continut in \"Valorie
dntusbgmcvp\" " - ltlt s.find_first_not_of("Valorie
dntusbgmcvp") -
- //gasirea caracterului '\n'
- cout ltlt "\n(find_last_not_of) primul caracter
de la dreapta care\n" - ltlt " nu este continut in \"Valorie
dntusbgmcvp\" " - ltlt s.find_last_not_of("Valorie
dntusbgmcvp") ltlt endl -
(find_first_not_of) primul caracter care nu
este continut in "Valorie dntusbgmcvp"
14 (find_last_not_of) primul carácter de la
dreapta care nu este continut in "Valorie
dntusbgmcvp" 132
20Sumar
- Asignarea si concatenarea string-urilor
- Subsiruri
- Caracteristicile obiectelor string
- Gasirea caracterelor într-un string
- Înlocuirea caracterelor dintr-un string
- Inserarea caracterelor într-un string
- Iteratori
- Procesarea stream-urilor string
21Înlocuirea caracterelor dintr-un string
- ...
- int main()
-
- string s("Valorile dintr-un subarbore stang"
- "\nsunt mai mici decat valoarea din"
- "\nnodul parinte si valorile din"
- "\norice subarbore drept sunt mai
mari" - "\ndecat valorile din nodul parinte")
-
- s.erase(62)
- cout ltlt "Sirul original dupa stergere\n" ltlt s
- ltlt "\n\nDupa inlocuire\n"
- ...
-
Sunt sterse toate caracterele de la locatia 62
pâna la sfârsitul sirului
Sirul original dupa stergere Valorile dintr-un
subarbore stang sunt mai mici decat valoarea
22Înlocuirea caracterelor dintr-un string
- ...
- int main()
-
- ...
- unsigned int x s.find(" ")
- while(x lt stringnpos)
-
- s.replace(x, 1, ".")
- x s.find(" ", x1)
-
- cout ltlt s ltlt endl
-
- return 0
-
Toate spatiile sunt înlocuite cu punct
Functia find întoarce constanta stringnpos când
ajunge la sfârsitul sirului
Dupa inlocuire Valorile.dintr-un.subarbore.stang
sunt.mai.mici.decat.valoarea
23Sumar
- Asignarea si concatenarea string-urilor
- Subsiruri
- Caracteristicile obiectelor string
- Gasirea caracterelor într-un string
- Înlocuirea caracterelor dintr-un string
- Inserarea caracterelor într-un string
- Iteratori
- Procesarea stream-urilor string
24Inserarea caracterelor într-un string
- ...
- int main()
-
- string s1("inceput sfarsit"),
- s2("mijloc "), s3("12345678"), s4("xx")
- cout ltlt "Sirurile initiale\ns1 " ltlt s1
- ltlt "\ns2 " ltlt s2 ltlt "\ns3 " ltlt s3
- ltlt "\ns4 " ltlt s4 ltlt "\n\n"
-
- s1.insert(8, s2)
-
- s3.insert(3, s4, 0, stringnpos)
- cout ltlt "Sirurile dupa insert\ns1 " ltlt s1
- ltlt "\ns2 " ltlt s2 ltlt "\ns3 " ltlt s3
- ltlt "\ns4 " ltlt s4 ltlt endl
- return 0
-
Inserarea cuvântului "mijloc" la pozitia 8
Inserarea sirului "xx" la pozitia 3 din s3.
Ultimele doua argumente specifica elementul de
start si numarul caracterelor din s4 care se
insereaza
Sirurile dupa insert s1 inceput mijloc
sfarsit s2 mijloc s3 123xx45678 s4 xx
25Sumar
- Asignarea si concatenarea string-urilor
- Subsiruri
- Caracteristicile obiectelor string
- Gasirea caracterelor într-un string
- Înlocuirea caracterelor dintr-un string
- Inserarea caracterelor într-un string
- Iteratori
- Procesarea stream-urilor string
26Iteratori
- Clasa string contine iteratori pentru parcurgerea
înainte si înapoi a unui sir - Iteratorii dau acces individual la caractere
- Sintaxa este similara operatorilor pointer
27Iteratori
- ...
- int main()
-
- string s("Testarea iteratorilor")
- stringconst_iterator i1 s.begin()
- cout ltlt "s " ltlt s
- ltlt "\n(Folosind iteratorul i1) s este "
- while(i1 ! s.end())
-
- cout ltlt i1
- i1
-
- cout ltlt endl
-
- return 0
-
Functii care returneaza iteratori
s Testarea iteratorilor (Folosind iteratorul
i1) s este Testarea iteratorilor
28Sumar
- Asignarea si concatenarea string-urilor
- Subsiruri
- Caracteristicile obiectelor string
- Gasirea caracterelor într-un string
- Înlocuirea caracterelor dintr-un string
- Inserarea caracterelor într-un string
- Iteratori
- Procesarea stream-urilor string
29Procesarea stream-urilor string
- In-memory I/O sau string stream processing
- posibilitatea intrarilor din string-uri din
memorie si a iesiriilor în string-uri în memorie - Clasele istringstream si ostringstream
- typedef basic_istringstreamltchargt istringstream
- typedef basic_ostringstreamltchargt ostringstream
- Clasele au aceleasi functionalitati ca istream si
ostream la care se adauga câteva functii
specifice formatarii în memorie - Pentru a folosi aceste clase trebuie include
fisierele header ltsstreamgt si ltiostreamgt
30Procesarea stream-urilor string
- Aplicatii ale acestei tehnici
- Validarea datelor
- Un program poate citi într-o prima faza o linie
de date dintr-un stream într-un string, urmând ca
apoi o rutina de validare sa parcurga si, daca
este necesar, sa corecteze datele. În final,
programul poate citi datele din string stiind ca
acestea sunt în formatul corect - Iesirea într-un string
- Datele pot fi pregatite într-un string pentru a
simula formatul de afisare pe ecran, dupa care
obiectul de tip string poate fi transferat pe
disc pastrând imaginea de pe ecran
31Procesarea stream-urilor string
- ...
- include ltsstreamgt
- using stdostringstream
- int main()
-
- ostringstream outputString
- string s1("Iesirie catorva tipuri de date "),
- s2("intr-un obiect ostringstream"),
- s3("\n double "),
- s4("\n int "),
- s5("\nadresa de int ")
- double d 123.4567
- int i 22
-
- outputString ltlt s1 ltlt s2 ltlt s3 ltlt d ltlt s4 ltlt d
ltlt s5 ltlt i - cout ltlt "outputString contine\n" ltlt
outputString.str() -
- ...
-
outputString contine Iesirie catorva tipuri de
date intr-un obiect ostringstream double
123.457 int 123.457 adresa de int
0x22fe34
32Procesarea stream-urilor string
- ...
- int main()
-
- ...
- outputString ltlt "\nse mai adauga caractere"
- cout ltlt "\n\nDupa inserarea in stream,\n"
- ltlt "outputString contine\n" ltlt
outputString.str() - ltlt endl
-
- return 0
-
Dupa inserarea in stream, outputString
contine Iesirie catorva tipuri de date intr-un
obiect ostringstream double 123.457
int 123.457 adresa de int 0x22fe34 se mai
adauga caractere
33Procesarea stream-urilor string
- Un obiect istringstream citeste date dintr-un
string în memorie - Datele sunt pastrate într-un istringstream ca si
caractere - Intrarile din obiectele istringstream
functioneaza asemanator intrarii dintr-un fisier
în general, sau de la intarea standard în
particular - Sfârsitul obiectului string este interpretat de
istringstream ca end-of-file
34Procesarea stream-urilor string
- ...
- int main()
-
- string input("Input test 123 4.7 A")
- istringstream inputString(input)
- string string1, string2
- int i
- double d
- char c
-
- inputString gtgt string1 gtgt string2 gtgt i gtgt d gtgt
c -
- cout ltlt "Au fost extrase urmatoarele
elemente\n" - ltlt "din obiectul istringstream"
- ltlt "\nstring " ltlt string1
- ltlt "\nstring " ltlt string2
- ltlt "\n int " ltlt i
- ltlt "\ndouble " ltlt d
- ltlt "\n char " ltlt c
Au fost extrase urmatoarele elemente din obiectul
istringstream string Input string test int
123 double 4.7 char A
35Procesarea stream-urilor string
- ...
- int main()
-
- ...
- //citire din stream vid
- long x
- inputString gtgt x
- if(inputString.good())
- cout ltlt "\n\nvaloarea long este " ltlt x ltlt
endl - else
- cout ltlt "\n\ninputString este vid" ltlt endl
-
- return 0
-
Conditia inputString.good() este evaluata ca
fiind false, executându-se ramura else a
structurii if/else
inputString este vid