SIRURI DE CARACTERE
-
Upload
informaticasitero -
Category
Documents
-
view
1.472 -
download
3
Transcript of SIRURI DE CARACTERE
Ş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>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;}
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]cin.get(a,3)cout<<a;
char a[10]cin.get(a,10,’g’)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*
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;}
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;}
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*
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.
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*
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;}
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ă 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.
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. Î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).
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
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.
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], …
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.
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 decaractere al şirului s1 – caractereconsecutive care încep obligatoriu cuprimul caracter – care se găsesc în şiruls2.
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.
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.
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.
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.
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 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.
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 tipunsigned long.
char* ultoa(unsegned long valoare, char * sir, int baza);
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.
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.
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ă.