Presentation is loading. Please wait.

Presentation is loading. Please wait.

Siruri de caractere.

Similar presentations


Presentation on theme: "Siruri de caractere."— Presentation transcript:

1 Siruri de caractere

2 1.1.Folosirea sirurilor Cea mai comună utilizare a tabloului unidimensional în limbajul C este şirul (de caractere). Spre deosebire de multe alte limbaje de programare, C nu conţine tipul de dată string. În schimb, C permite utilizarea şirurilor folosind tablouri unidimensionale de tip char.

3 1.2.Definirea sirurilor Şirul este definit ca fiind un tablou de caractere terminat prin caracterul null (‘\0’, codul ASCII 0). Faptul că şirul trebuie terminat prin caracterul null înseamnă că tabloul trebuie astfel definit încât să poată conţine un şir cu un octet mai lung decât cel mai lung şir ce va fi reprezentat vreodată în acest tablou, pentru a face loc caracterului null. Un şir constant este automat terminat prin caracterul null de către compilator.

4 1.3.Citirea unui sir de la tastatura
Pentru a citi un şir de la tastatură, trebuie apelată funcţia gets(), care reclamă includerea header-ului stdio.h. Funcţia gets() trebuie apelată folosind numele tabloului de caractere care este un pointer către începutul zonei de memorie unde va fi stocat şirul de caractere citit. Funcţia gets() citeşte caractere până când este apăsată tasta ENTER. Tasta ENTER este înlocuită de compilator cu caracterul \0 (null) care termină şirul.

5 De exemplu, programul următor citeşte şi afişează un şir introdus de la tastatură :
#include<stdio.h> #include<iostream.h> void main() { char str[80]; int j; cout<<”Introduceti un sir(<de 80 de caractere):\n”; gets(str); //citeşte şirul de caractere de la tastatură for(j=0;str[j];j++) cou<<str[j]; //afişează şirul parcurs caracter cu caracter prin indice }

6 Să remarcăm că programul, pentru a controla ciclul care afişează şirul, utilizează faptul că null este false(0). Funcţia gets() nu efectuează verificări asupra limitelor în care variază indexul tabloului, aşa că este posibil ca utilizatorul să introducă mai multe caractere decât poate conţine şirul. Deci trebuie să fiţi siguri că aţi apelat funcţia gets() cu un tablou suficient de mare, care să poată conţine şi caracterele neaşteptate.

7 1.3. Afisarea sirurilor Există un mod mult mai simplu de a afişa şirurile, folosind funcţia printf() sau puts() . Dacă după afişarea şirului se doreşte trecerea la o linie nouă, se poate afişa str după cum urmează : cout<<str<<endl;/cout<<str<<”\n”; Programul anterior, rescris cu ajutorul acestei funcţii este : #include<stdio.h> #include<iostream.h> void main() { char str[80]; int j; cout<<”Introduceti un sir(<de 80 de caractere):\n”; gets(str); cout<<str; // puts(sir); }

8 Exemplu: Fiind dat un cuvânt să se afişeze toate sufixele acestuia
Exemplu: Fiind dat un cuvânt să se afişeze toate sufixele acestuia. Literele fiecărui sufix vor fi separate prin două spaţii. #include<stdio.h> #include<string.h> #include<iostream.h> void main() { char t[200],*p,x; int k=0; cout<<”sirul: "; gets(t); cout<<”caracterul: "; cin>>x; p=strchr(t,x); //prima aparitie a lui x in sirul t while(p) //cat timp x apare in sir k++; //il numar strcpy(p,p+1); //sterg caracterul din pozitia p adica pe x p=strchr(t,x); //urmatoarea aparitie a lui x in t } cout<<"caracterul”<<x” apare de”<<k<<” ori\n"; cout<<"textul dupa stergere: "; puts(t);

9 2.Tablouri de şiruri Tablourile de şiruri, numite deseori şi tabele de şiruri, sunt foarte des folosite în C. O tabelă bidimensională de şiruri se poate crea ca oricare alt tablou bidimensional. Totuşi modul în care trebuie gândit un tablou de şiruri este puţin diferit. Fie următoarea declaraţie : char names[10][40]; Această declaraţie specifică o tabelă care conţine 10 şiruri, fiecare având lungimea de până la 40 de caractere. Pentru a accesa un şir din tabelă, trebuie specificat numai primul index. De exemplu, pentru a citi de la tastatură al treilea şir al tabelei, trebuie folosită instrucţiunea : gets(names[2]);. Pentru a afişa primul şir al tabelei trebuie folosită instrucţiunea : cout<<name[0]; .

10 2.1.Funcţii standard pentru prelucrarea şirurilor de caractere
În legătură cu şirurile de caractere se au în vedere operaţii de felul următor: calculul lungimii şirurilor de caractere copierea şirurilor de caractere concatenarea şirurilor de caractere compararea şirurilor de caractere căutarea în şiruri de caractere Funcţiile standard prin care se realizează aceste operaţii au fiecare un nume care începe cu prefixul str şi au prototipul în fişierul header string.h care trebuie inclus în program.

11 2.1.1. Lungimea unui şir de caractere
Lungimea unui şir de caractere este numărul de caractere proprii care intră în compunerea şirului respectiv. Caracterul \0 este un caracter impropriu şi el nu este considerat la determinarea lungimii unui şir de caractere. Prezenţa lui este însă necesară, deoarece la determinarea lungimii unui şir se numără caracterele acestuia până la întâlnirea caracterului null. Funcţia pentru determinarea lungimii unui şir de caractere are prototipul : unsigned strlen(const char *s);

12 Exemplul 1: char *const p=”Acesta este un sir”; unsigned n; …..
n=strlen(p);

13 Lui n i se atribuie valoarea 18, numărul caracterelor proprii ale şirului spre care pointează p.

14 Exemplul 2: char tab[]=”Acesta este un sir”; int n; n=strlen(tab);

15 Variabila n primeste aceeaşi valoare ca în exemplul precedent.

16 Exemplul 3: int n; n=strlen(“Acesta este un sir”);

17 Observaţie : Parametrul funcţiei strlen este un pointer spre un şir constant deoarece funcţia strlen nu are voie să modifice caracterele şirului pentru care determină lungimea.

18 2.2.2 Copierea unui şir de caractere
Adesea este nevoie să se copie un şir de caractere din zona de memorie în care se află, în altă zonă. În acest scop se poate folosi funcţia : char *strcpy(char *dest, const char *sursa); Funcţia copiază şirul de caractere spre care pointează sursa în zona de memorie a cărei adresă de început este valoarea lui dest. Funcţia copiază atât caracterele proprii şirului, cât şi caracterul \0 de la sfârşitul şirului respectiv. Se presupune că zona de memorie în care se face copierea este destul de mare pentru a putea păstra caracterele copiate. În caz contrar se alterează datele păstrate imediat după zona rezervată la adresa definită de parametrul dest. La revenire, funcţia returnează adresa de început a zonei în care s-a transferat şirul, adică chiar valoarea lui dest. Această valoare este pointer spre caractere, deci tipul returnat de funcţie este : char*.

19 Observatie: - parametrul sursa, care defineşte zona în care se află şirul ce se copiază, este declarat prin modificatorul const. Aceasta deoarece funcţia strcpy nu are voie să modifice şirul care se copiază. În schimb, parametrul dest nu este declarat cu parametrul const deoarece funcţia strcpy modifică zona spre care pointează dest (în ea se copiază caracterele şirului).

20 Exemplul 1: char tab[]=”Acest sir se copiaza”; char t[sizeof(tab)];
/* are acelaşi număr de elemente ca şi tab */ ….. strcpy(t,tab); /* şirul din tab se copiază în zona alocată lui t*/

21 Exemplul 2: char t[100]; strcpy(t,”Acest sir se copiaza”);
/* se copie la adresa t şirul constat dat ca al doilea parametru*/

22 Exemplul 3: char *p=”Acest sir se copiaza”; char t[100]; char *q;
q=strcpy(t,p);

23 Şirul păstrat în zona spre care pointează p se transferă în zona spre care pointează t. Valoarea lui t se atribuie lui q. Pentru a copia cel mult n caractere ale unui şir dintr-o zonă de memorie în alta, se va folosi funcţia de prototip : char *strncpy(char *dest , const char *sursa, unsigned n); Dacă n>lungimea şirului spre care pointează sursa, atunci toate caracterele şirului respectiv se transferă în zona spre care pointează dest. Altfel se copiază numai primele n caractere ale şirului. În rest, funcţia strncpy are acelaşi efect ca şi strcpy.

24 Exemplu: char *p=”Acest sir se copiaza trunchiat”; char t[10];
strncpy(t,p,10); /* se vor copia numai primele 10 caractere*/


Download ppt "Siruri de caractere."

Similar presentations


Ads by Google