SIRURI DE CARACTERE

48
ŞIRURI DE CARACTERE ÎN C++

Transcript of SIRURI DE CARACTERE

Page 1: SIRURI DE CARACTERE

ŞIRURI DE CARACTEREÎN C++

Page 2: SIRURI DE CARACTERE

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”

Page 3: SIRURI DE CARACTERE

Citirea şi scrierea şirurilor de caractere

#include<iostream.h>main(){ char a[20];int i;for(i=0;i<10;i++) cin>>a[i];a[10]=0;for(i=0; i<10; i++) cout<<a[i];}

#include<iostream.h>main(){ char a[20];cin>>a;cout<<a;}

Page 4: SIRURI DE CARACTERE

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

Page 5: SIRURI DE CARACTERE

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’)

Page 6: SIRURI DE CARACTERE

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”).

Page 7: SIRURI DE CARACTERE

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.

Page 8: SIRURI DE CARACTERE

Care este efectul în ce două exemple?

char a[10]cin.get(a,3)cout<<a;

char a[10]cin.get(a,10,’g’)cout<<a;

Page 9: SIRURI DE CARACTERE

Î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)

Page 10: SIRURI DE CARACTERE

Tipul char*

Limbajul C++ permiteca un vector decaractere să fieadresat începând dela un anumit octet alsău.

#include<iostream.h>main(){ char a[]=“casa”;cout<<a+1<<“ ”<<a+2<<“ ”;cout<<a+3;}

Page 11: SIRURI DE CARACTERE

Tipul char* când scriem a, adresăm

vectorul începând cuprimul octet

când scriem a+1,adresăm vectorulîncepând cu al doileaoctet

când scriem a+2,adresăm vectorulîncepând cu al treileaoctet

#include<iostream.h>main(){ char a[]=“casa”;cout<<a+1<<“ ”<<a+2<<“ ”;cout<<a+3;}

Page 12: SIRURI DE CARACTERE

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

Page 13: SIRURI DE CARACTERE

Tipul char*

Tipul expresiilor 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.

Page 14: SIRURI DE CARACTERE

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

Page 15: SIRURI DE CARACTERE

Tipul char*

a este un vector decaractere

p este o variabilă detip char*.

#include<iostream.h>main(){ char a[]=“Exemplu”, *p;p=a; cout<<p<<endl;p++; cout<<p<<endl;p++; cout<<p<<endl;cout<<p[1]<<endl;cout<<p-a;}

Page 16: SIRURI DE CARACTERE

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

Page 17: SIRURI DE CARACTERE

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.

Page 18: SIRURI DE CARACTERE

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ă sursară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.

Page 19: SIRURI DE CARACTERE

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.

Page 20: SIRURI DE CARACTERE

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. Încazul în care caracterul este găsit, funcţiaîntoarce adresa subşirului care începe cu primaapariţie a caracterului citit şi se termină cucaracterul nul al şirului în care se face căutarea.Altfel, întoarce o expresie de tip char* cuvaloarea 0 (adică o adresă vidă de şir).

Page 21: SIRURI DE CARACTERE

Compararea şirurilor

Funcţia strcmp are forma generalăint strcmp( const char* s1, const char* s2);şi are rolul de a compara două şiruri decaractere. Valoarea returnată este:

• <0, dacă s1<s2• =0, dacă s1 = s2• >0, dacă s1 > s2

Page 22: SIRURI DE CARACTERE

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ă nuface distincţie între literele mari şi mici.

Page 23: SIRURI DE CARACTERE

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 mult25 de caractere (inclusiv caracterul nul).Cuvintele pot fi adresate prin a[0], a[1], …

Page 24: SIRURI DE CARACTERE

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 estesubşir (caractere succesive) al şirului s1. Dacăacesta este identificat, funcţia returnează adresade început în cadrul şirului s1, altfel returneazăadresa nulă (0). Căutarea se face de la stângala dreapta. În cazul în care s2 apare de maimulte ori în cadrul lui s1, se returnează adresade început a primei apariţii.

Page 25: SIRURI DE CARACTERE

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;

Page 26: SIRURI DE CARACTERE

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

Page 27: SIRURI DE CARACTERE

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

Page 28: SIRURI DE CARACTERE

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 decaractere al şirului s1 – caractereconsecutive care încep obligatoriu cuprimul caracter – care se găsesc în şiruls2.

Page 29: SIRURI DE CARACTERE

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 decaractere al şirului s1 – caractereconsecutive care încep obligatoriu cuprimul caracter – care nu se găsesc înşirul s2.

Page 30: SIRURI DE CARACTERE

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’). Restulcaracterelor rămân neschimbate. Funcţiaîntoarce adresa s.

Page 31: SIRURI DE CARACTERE

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’). Restulcaracterelor rămân neschimbate. Funcţiaîntoarce adresa s.

Page 32: SIRURI DE CARACTERE

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 încadrul şirului s1 şi execuţia se termină,altfel trece la pasul următor.

Page 33: SIRURI DE CARACTERE

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

Page 34: SIRURI DE CARACTERE

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’

Page 35: SIRURI DE CARACTERE

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.

Page 36: SIRURI DE CARACTERE

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.

Page 37: SIRURI DE 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.

Page 38: SIRURI DE CARACTERE

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.

Page 39: SIRURI DE CARACTERE

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.

Page 40: SIRURI DE CARACTERE

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;

Page 41: SIRURI DE CARACTERE

Funcţia ecvtchar* 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.

Page 42: SIRURI DE CARACTERE

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.

Page 43: SIRURI DE CARACTERE

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.

Page 44: SIRURI DE CARACTERE

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

Page 45: SIRURI DE CARACTERE

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 tipunsigned long.

char* ultoa(unsegned long valoare, char * sir, int baza);

Page 46: SIRURI DE CARACTERE

Conversia şirurilor în valori numerice şi invers

Funcţialong 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.

Page 47: SIRURI DE CARACTERE

Conversia şirurilor în valori numerice şi invers

Funcţiadouble strtod(const char *s, char **endptr);converteşte un şir către double. Funcţialong 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.

Page 48: SIRURI DE CARACTERE

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