Sunteți pe pagina 1din 48

ŞIRURI DE CARACTERE

ÎN C++
Generalităţi
Vectorii de caractere pot fi iniţializaţi la
declarare, caracterul nul fiind memorat
automat.
char vect[11]=“calculator”
char vect[]=“calculator”
char vect[100]=“calculator”
Citirea şi scrierea şirurilor de
caractere

#include<iostream.h> #include<iostream.h>
main() main()
{ char a[20]; { char a[20];
int i; cin>>a;
for(i=0;i<10;i++) cin>>a[i]; cout<<a;
a[10]=0; }
for(i=0; i<10; i++) cout<<a[i];
}
Citirea şi scrierea şirurilor de
caractere
 Caracterul nul este adăugat automat
 Putem citi orice cuvânt cu un număr de
până la 19 caractere – excluzând
caracterul nul.
 Putem să rezervăm, în limita memoriei pe
care o are la dispoziţie programul, un
număr mai mare de octeţi.
 Un vector poate fi adresat pe componente
 Se sar caracterele albe.
 Se citeşte şirul care începe cu primul
caracter care nu este alb şi se sfârşeşte la
întâlnirea primului caracter alb.
 Pentru citirea şirurilor de caractere vom
utiliza o funcţie de un tip special, şi
anume:
cin.get(vector_de_caractere, int nr, char=‘\n’)
Funcţia
cin.get(vector_de_caractere, int nr, char=‘\n’)
citeşte un şir de caractere până când este
îndeplinită una dintre condiţiile de mai jos:
 au fost citite nr-1 caractere;
 a fost întâlnit caracterul transmis ca ultim
parametru (implicit “\n”).
Observaţii
 Sunt citite şi caractere albe.
 Este inserat caracterul nul.
 Caracterul transmis ca ultim parametru nu
este inserat în şir.
 Al treilea parametru este trecut în mod
facultativ.
Care este efectul în ce două
exemple?
char a[10] char a[10]
cin.get(a,3) cin.get(a,10,’g’)
cout<<a; cout<<a;
În C++ pot exista mai multe funcţii cu acelaşi
nume, dar care diferă prin parametrii
primiţi.
Funcţia
cin.get()
fără parametri are rolul de a citi un caracter
(fie că este alb, fie că nu)
Tipul char*
#include<iostream.h>
Limbajul C++ permite main()
ca un vector de { char a[]=“casa”;


cout<<a+1<<“ ”<<a+2<<“ ”;
caractere fie cout<<a+3;
adresat începând de }
la un anumit octet al
său.
Tipul char*
#include<iostream.h>
 când scriem a, adresăm main()
vectorul începând cu { char a[]=“casa”;
primul octet cout<<a+1<<“ ”<<a+2<<“ ”;
 când scriem a+1, cout<<a+3;
adresăm vectorul }
începând cu al doilea
octet
 când scriem a+2,
adresăm vectorul
începând cu al treilea
octet
Tipul char*
Vectorii astfel adresaţi pot fi
accesaţi aşa cum suntem
deja obişnuiţi.
(a+1)[0] reţine caracterul ‘a’
(a+1)[1] reţine caracterul ‘s’
#include<iostream.h>
main()
{ char a[]=“casa”;
cout<<a+1<<“ ”<<a+2<<“ ”;
cout<<a+3;
}
Tipul char*
 Tipulexpresiilor a-1, a-2 este de tip char*,
adică sunt adrese.
 Numărul de ordine al unui octet în
memoria internă se numeşte adresa
octetului respectiv.
 Adresa unui vector de caractere este
adresa primului său octet.
Tipul char*
O variabilă de tip char* poate reţine
adresa unui vector de caractere.
 În C++, numele unui vector de caractere
este o adresă constantă de vector şi poate
fi atribuit unei variabile de tip char*.
Tipul char*
#include<iostream.h>
a este un vector de main()
caractere { char a[]=“Exemplu”, *p;
p=a; cout<<p<<endl;
 p este o variabilă de p++; cout<<p<<endl;
tip char*. p++; cout<<p<<endl;
cout<<p[1]<<endl;
cout<<p-a;
}
Lungimea unui şir de caractere
Funcţia strlen are rolul de a returna
lungimea efectivă a unui şir:
size_t strlen(char* a)
unde:
 size_t este un tip întreg, utilizat în
adresarea memoriei, definit în string.h
 argumentul este de tip char*(adică o
adresă către un şir).
Copierea şi concatenarea şirurilor
de caractere
 Funcţia strcpy are forma generală

char *strcpy(char* dest, char* sursa);

şi are rolul de a copia şirul de adresă


sursa la adresa dest. Copierea se termină
după ce a fost copiat caracterul nul. Se
returnează adresa dest.
Copierea şi concatenarea şirurilor
de caractere
 Funcţia strcat are forma generală
char *strcat(char* dest, char* sursa);
şi are rolul de a adăuga şirului de adresă dest
şirul de adresă sursa. Şirul de adresă sursa
rămâne nemodificat. Această operaţie se
numeşte concatenare şi nu este comutativă.
Rezultatul este adresa şirului sursa, iar şirul va
avea ca lungime suma lungimilor celor două
şiruri care au fost concatenate.
Copierea şi concatenarea şirurilor
de caractere
 Funcţia strncat are forma generală

char *strncat(char* dest, const char* sursa, size_t nr);

şi are rolul ca strcat cu deosebirea că adaugă


şirului destinaţie primii nr octeţi ai şirului sursa.
Adăugarea caracterelor se face înaintea
caracterului nul. Funcţia returnează adresa de
început a şirului destinaţie.
Căutarea unui caracter într-un şir
 Funcţia strchr are forma generală
char* strchr(char* s, int c);
şi are rolul de a căuta caracterul ‘c’ în şirul s.
Căutarea se face de la stânga la dreapta. În
cazul în care caracterul este găsit, funcţia
întoarce adresa subşirului care începe cu prima
apariţie a caracterului citit şi se termină cu
caracterul nul al şirului în care se face căutarea.
Altfel, întoarce o expresie de tip char* cu
valoarea 0 (adică o adresă vidă de şir).
Compararea şirurilor
 Funcţia strcmp are forma generală
int strcmp( const char* s1, const char* s2);
şi are rolul de a compara două şiruri de
caractere. Valoarea returnată este:
• <0, dacă s1<s2
• =0, dacă s1 = s2
• >0, dacă s1 > s2
Compararea şirurilor
 Funcţia strcmp face distincţie între
literele mari şi mici ale alfabetului.
 Funcţia stricmp are forma generală
int stricmp( const char* s1, const char* s2);
şi are rol ca strcmp. Diferenţa este că nu
face distincţie între literele mari şi mici.
Vectori de cuvinte
Prin cuvânt se înţelege o succesiune de caractere
care nu sunt albe.
Vectorii de cuvinte sunt matrice cu elemente de
bază de tip char.
char a[10][25]
Fiecare linie din cele 10 ale matricei poate reţine
un şir de caractere. Acesta poate avea cel mult
25 de caractere (inclusiv caracterul nul).
Cuvintele pot fi adresate prin a[0], a[1], …
Subşiruri
 Funcţia strstr are forma generală
char *strstr( const char* s1, const char* s2);
şi are rolul de a identifica dacă şirul s2 este
subşir (caractere succesive) al şirului s1. Dacă
acesta este identificat, funcţia returnează adresa
de început în cadrul şirului s1, altfel returnează
adresa nulă (0). Căutarea se face de la stânga
la dreapta. În cazul în care s2 apare de mai
multe ori în cadrul lui s1, se returnează adresa
de început a primei apariţii.
Alte funcţii utile în prelucrarea
şirurilor
 Funcţia strtok are forma generală
char *strtok(char* s1, const char* s2);
Principiul de executare este următorul:
• Şirul s1 este considerat ca fiind alcătuit din
0,1,…n entităţi separate prin unul sau mai
multe caractere cu rol de separator, iar
şirul s2 ca fiind alcătuit din unul sau mai
multe caractere cu rol de separator;
Alte funcţii utile în prelucrarea
şirurilor
• La prima apelare care trebuie să fie de
forma
strtok(s1,s2);
funcţia întoarce adresa primului caracter al
primei entităţi. După prima entitate
separatorul este înlocuit automat prin
caracterul nul (cod 0).
Alte funcţii utile în prelucrarea
şirurilor
• Următoarele apeluri ale funcţiei sunt de
forma
strtok(NULL, s2);
iar funcţia întoarce de fiecare dată adresa
primului caracter al următoarei entităţi şi,
după ea, este adăugat caracterul nul.
• În momentul în care şirul rămas nu mai
conţine entităţi, funcţia întoarce adresa
nulă.
Alte funcţii utile în prelucrarea
şirurilor
 Funcţia strspn are forma generală
size_t strspn(char* s1, char* s2);
şi are rolul de a returna numărul de
caractere al şirului s1 – caractere
consecutive care încep obligatoriu cu
primul caracter – care se găsesc în şirul
s2.
Alte funcţii utile în prelucrarea
şirurilor
 Funcţia strcspn are forma generală
size_t strcspn( const char* s1, const char* s2);
şi are rolul de a returna numărul de
caractere al şirului s1 – caractere
consecutive care încep obligatoriu cu
primul caracter – care nu se găsesc în
şirul s2.
Alte funcţii utile în prelucrarea
şirurilor
 Funcţia strlwr are forma generală
char * strlwr(char* s);
Ea converteşte toate literele mari
(‘A’ …’Z’) în litere mici (‘a’ … ‘z’). Restul
caracterelor rămân neschimbate. Funcţia
întoarce adresa s.
Alte funcţii utile în prelucrarea
şirurilor
 Funcţia strupr are forma generală
char * strupr(char* s);
şi are rolul de a converti toate literele mici
(‘a’ … ‘z’) în litere mari (‘A’ …’Z’). Restul
caracterelor rămân neschimbate. Funcţia
întoarce adresa s.
Alte funcţii utile în prelucrarea
şirurilor
 Funcţia strpbrk are forma generală
char * strbrk(char* s1, char* s2);
acţionează în felul următor:
• Caută primul caracter al şirului s1 în s2.
Dacă este găsit, returnează adresa sa în
cadrul şirului s1 şi execuţia se termină,
altfel trece la pasul următor.
Funcţia strpbrk
• Caută al doilea caracter al şirului s1 în s2.
Dacă este găsit, returnează adresa sa din
cadrul şirului s1 şi execuţia se termină,
altfel trece la pasul următor. …
• Dacă nici un caracter al şirului s1 nu
aparţine şirului s2, funcţia returnează
adresa nulă.
Citirea şi scrierea şirurilor de
caractere din şi în fişiere text
Operaţia de citire
 Pentru a citi o linie a unui fişier text, se
poate folosi funcţia următoare:
getline(char* adresa_sir, int nr_char, char=‘\n’)
Funcţia citeşte un şir de caractere, până când una
dintre condiţiile următoare este îndeplinită:
a) au fost citite nr_char-1 caractere;
b) A fost detectat sfârşitul de linie ‘\n’
Operaţia de citire
 Prin f>>linie_citita, citirea se efectuează
astfel:
a) începând cu poziţia curentă a pointerului se
sar toate caracterele albe;
b) se citesc toate caracterele până la întâlnirea
unui caracter alb.
Operaţia de citire
 Caracterul care marchează sfârşitul liniei ‘\n’ nu
este inserat în şir, în schimb este inserat
caracterul nul.
 Este suficient să apelăm funcţia cu primii doi
parametrii, ultimul fiind implicit.
 Ultimul parametru poate fi apelat explicit cu o
valoare convenabilă, caz în care citirea se face
până la întâlnirea ei sau până când au fost
citite nr_car-1 caractere.
Citirea şi scrierea şirurilor de
caractere din şi în fişiere text
Operaţia de scriere
Scrierea se face prin comanda
f<<sir;
Prin această instrucţiune se scrie întreg
şirul, începând cu poziţia curentă a
pointerului, inclusiv caracterele albe.
Conversia şirurilor în valori
numerice şi invers
Funcţiile utilizate pentru conversia valorilor
numerice în şir şi invers au prototipul
stdlib.h.
 Funcţia atof converteşte un şir către tipul
double.
double atof(const char *s)
Dacă conversia eşuează (se întâlneşte un caracter
nenumeric) valoarea întoarsă este 0. Dacă primele
caractere ale şirului sunt albe, acestea sunt ignorate.
Conversia şirurilor în valori
numerice şi invers
 Funcţia atold converteşte un şir către tipul
long double:
long double atold(const char *s);
 Funcţia atoi converteşte un şir către tipul
int: int atoi(const char *s);
 Funcţia atol converteşte un şir către tipul
long: long atol(const char *s);
Dacă conversia eşuează (se întâlneşte un caracter nenumeric)
valoarea întoarsă este 0. Dacă primele caractere ale şirului
sunt albe, acestea sunt ignorate.
Conversia şirurilor în valori
numerice şi invers
 Funcţia ecvt are rolul de a converti o valoare
de tip double către un şir. Caracterul nul este
adăugat automat şirului obţinut. Forma
generală este:
char* ecvt(double valoare, int poz, int* zec, int* semn);
unde:
• valoare – valoarea de convertit;
• poz – numărul de poziţii pe care trebuie să le ocupe
şirul în urma conversiei;
Funcţia ecvt
char* ecvt(double valoare, int poz, int* zec, int* semn);
unde:
• zec – adresa unei variabile, de tip int, care reţine,
după apel, numărul zecimalelor pe care le are
numărul;
• semn - adresa unei variabile, de tip int, care are rolul
de a memora, după apel, 1, dacă numărul este
negativ, sau 0, în caz contrar.
Funcţia ecvt
 Dacă a este o variabilă, &a este adresa ei.
 Variabila zec reţine după apel numărul
întregilor, iar variabila semn semnul
rezultatului.
 Funcţia nu inserează în şir nici punctul
zecimal, nici semnul numărului.
 Şirul obţinut începe cu cifra cea mai
semnificativă a numărului.
Funcţia ecvt
 Dacă numărul poziţiilor ocupate de şir
(poz) este mai mare decât ocupă data,
şirul este completat în stânga cu un număr
de 0 necesar.
 În cazul în care numărul poziţiilor este mai
mic decât cel ocupat de număr, rezultatul
este rotunjit.
Conversia şirurilor în valori
numerice şi invers
 Funcţia itoa are rolul de a converti o valoare
de tip int într-un şir, a cărui adresă este
memorată în variabila şir. Valoarea baza reţine
baza de numeraţie către care să se facă
conversia. În cazul bazei 10, şirul obţinut reţine
şi, eventual, semnul “-”. Funcţia întoarce
adresa şirului obţinut.
char* itoa(int valoare, char * sir, int baza);
Conversia şirurilor în valori
numerice şi invers
 Funcţia
ltoa are acelaşi efect ca itoa,
deosebirea fiind dată de faptul că se
converteşte către şir o valoare de tip long int.
char* ltoa(long valoare, char * sir, int baza);
 Funcţia
ultoa are acelaşi efect ca itoa,
deosebirea fiind dată de faptul că se
converteşte către şir o valoare de tip
unsigned long.
char* ultoa(unsegned long valoare, char * sir, int baza);
Conversia şirurilor în valori
numerice şi invers
 Funcţia
long strtol(const char *s, char **endptr, int baza);
are rolul de a converti un şir către long. În
afara şirului care trebuie convertit, funcţia
primeşte ca parametru de intrare adresa
unei variabile de tip char*. După apel,
această variabilă va reţine poziţia
primului caracter din şir care nu poate fi
convertit.
Conversia şirurilor în valori
numerice şi invers
 Funcţia
double strtod(const char *s, char **endptr);
converteşte un şir către double.
 Funcţia
long double_strtold(const char *s, char **endptr);
converteşte un şir către long double.
 Funcţia
unsigned long strtoul(const char *s, char **endptr, int baza);
converteşte un şir către unsigned long.
Conversia şirurilor în valori
numerice şi invers
În caz de depăşire – adică numărul nu
poate fi memorat deoarece este în afara
tipului – funcţiile strtol, strtod, strtold şi
strtoul returnează cea mai mare sau cea
mai mică valoare care poate fi memorată
de tipul în care se face conversia, după
cum valoarea este pozitivă sau negativă.

S-ar putea să vă placă și