Sunteți pe pagina 1din 7

Capitolul 7 iruri de caractere

Obiectiv: examinarea posibilitilor lucrului cu iruri de caractere n limbajul C. Activiti - Prezentarea generalitilor despre lucrul cu iruri de caractere n limbajul C; - Lucrul cu principalele funcii din biblioteca standard C pentru iruri de caractere;

7.1

Generaliti despre lucrul cu iruri de caractere n limbajul C

Limbajul C nu dispune de un tip de date nativ pentru reprezentarea irurilor de caractere de lungime variabil. n acest scop se utilizeaz structuri de date de tip tablou de caractere. ntruct irurile de caractere prelucrate n programe au n general lungime variabil, s-a stabilit o convenie prin care ultimul caracter utilizat al unui ir este urmat de un caracter cu valoarea zero ('\0'), numit terminator de ir. char sir [10]; Exemplul de mai sus declar un tablou de 10 de elemente de tip caracter. Un asemenea tablou se poate folosi pentru memorarea unui ir de caractere de lungime variabil, dar de maxim 9 de caractere, ntruct ultimul element este rezervat pentru terminatorul de ir. Dac irul de mai sus conine valoarea "TEST", coninutul memoriei rezervate tabloului este urmtorul: Index Continut 0 T 1 E 2 S 3 T 4 \0 5 6 7 8 9 -

Valoarea elementelor tabloului corespunztoare indicilor de la 5 la 9 nu este cunoscut. Evident, aceste tablouri care memoreaz iruri de caractere se pot aloca i dinamic: char *sir = (char*)malloc (10 * sizeof (char)); /* ...operatii cu variabila sir... */ free (sir); Dac se dorete doar accesarea i prelucrarea elementelor unui ir de caractere care a fost alocat anterior, static (declaraie de tablou) sau dinamic, se poate utiliza i o variabil de tip pointer ctre caracter: char sir [10]; char *ptrsir; ptrsir = sir; /*Ambele variabile indica spre acelasi sir de caractere*/
sir ptrsir

Orice ir de caractere care se prelucreaz n program trebuie s dispun ns de o declaraie de alocare de memorie (static sau dinamic).

Programarea Calculatoarelor

Capitolul 7 iruri de caractere

Compilatoarele de C permit iniializarea tablourilor de caractere n momentul declarrii acestora cu un ir de caractere: char sir [10] = "Un sir"; n urma acestei declaraii, variabila sir va avea urmtorul coninut: Index Continut 0 U 1 n 2 3 S 4 i 5 r 6 \0 7 8 9 -

7.2 Principalele funcii din biblioteca standard C pentru lucrul cu iruri de caractere
ntrucat nu exist tip de date nativ ir de caractere, limbajul nu dispune nici de operatori pentru prelucrarea irurilor. Exist ns o serie de funcii care asist programatorul n lucrul cu irurile de caractere. Aceste funcii necesit includerea fiierului header string.h. Toate funciile din aceast bibliotec presupun c variabilele de tip ir de caractere asupra crora opereaz respect convenia de a avea un terminator (caracter cu codul 0). 7.2.1 Citirea i afiarea unui sir de caractere de la tastatur
Pentru citirea unui ir de caractere se poate utiliza funcia scanf cu specificatorul de format %s. Pentru afiarea unui ir de caractere se poate utiliza funcia printf, cu acelai specificator de format: char sir [80]; printf ("Introduceti un sir: "); scanf ("%s", sir); printf ("Ati tastat: %s \n", sir); ntruct variabila ir este declarat ca i tablou, numele acesteia reprezint un pointer ctre primul element, de aceea nu se mai folosete operatorul adres (&) n apelul scanf. Utilizarea funciei scanf pentru citirea irurilor de caractere are un dezavantaj major: nu se pot citi iruri care conin spaii sau tab. De aceea, se recomand utilizarea funciei gets: char sir [80]; printf ("Introduceti un sir: "); gets (sir); printf ("Ati tastat: %s \n", sir);

7.2.2 Lungimea unui ir de caractere


Pentru a determina lungimea unui ir de caractere se folosete funcia: int strlen (char *sir) Funcia returneaz lungimea irului de caractere primit ca i parametru. Exemplu: char sir [80]; int n; printf ("Introduceti un sir: "); gets (sir);

Programarea Calculatoarelor

Capitolul 7 iruri de caractere

n = strlen (sir); printf ("Lungimea sirului este: %d \n", n);

7.2.3 Copierea coninutului unui ir de caractere


Pentru a copia coninutul unei variabile sau constante de tip ir de caractere ntr-o variabil tot de tip ir de caractere trebuie utilizat funcia: char *strcpy (char *destinatie, char *sursa) Exemplu: char sir1[80], sir2[80]; printf ("Introduceti un sir: "); gets (sir1); strcpy (sir2, sir1); /* nu este permisa atribuirea sir2 = sir1 ! */ printf ("Ati tastat: %s \n", sir2); Este sarcina programatorului s se asigure c destinaia are suficient spaiu alocat pentru a memora toate caracterele din variabila surs (inclusiv terminatorul de ir).

7.2.4 Compararea alfabetic a doua iruri de caractere


Pentru compararea a dou iruri de caractere nu se pot aplica operatorii relationali ntre cele doua iruri (<, >, <=, >=, ==, !=), ntruct acetia au ca efect compararea adreselor n memorie ale celor dou iruri. De aceea trebuie utilizat aceast funcie: int strcmp (char *s1, char *s2) Rezultatul funciei este: negativ dac irul s1 este mai mic dect s2 din punct de vedere al coninutului; zero dac s1 i s2 au acelai coninut; mai mare ca zero, dac irul s1 este mai mare dect irul s2 din punct de vedere al coninutului; Exemplu: char sir1 [80], sir2 [80]; int x; printf ("Introduceti primul sir: "); gets (sir1); printf ("Introduceti al doilea sir: "); gets (sir2); x = strcmp (sir1, sir2); if (x > 0) printf ("%s > %s \n", sir1, sir2); else if (x == 0) printf ("%s == %s \n", sir1, sir2); else printf ("%s < %s \n", sir1, sir2);

Programarea Calculatoarelor

Capitolul 7 iruri de caractere

7.2.5 Cutarea unui subir ntr-un ir


Pentru cutarea unui subsir ntr-un ir se utilizeaz functia strstr: char *strstr (char *sir, char *subsir) Funcia returneaz un pointer la prima apariie a coninutului variabilei subsir n coninutul variabilei sir sau valoarea NULL dac subsirul nu apare n irul cutat. Exemplu: char sir [80], subsir [80]; char *p; printf ("Introduceti sirul: "); gets (sir1); printf ("Introduceti subsirul cautat: "); gets (sir2); p = strstr (sir, subsir); if (p != NULL) printf ("%s contine %s \n", sir, subsir); else printf ("%s nu contine %s \n", sir, subsir);

7.2.6 Concatenarea a doua iruri de caractere


Pentru concatenarea a dou iruri de caractere se folosete funcia: char *strcat (char *dest, char *sursa) Din nou, este responsabilitatea programatorului s se asigure c destinaia are suficient spaiu alocat pentru a memora toate caracterele din variabila surs (inclusiv terminatorul de ir). Exemplu: char sir1[40], sir2[40], sir [80]; printf ("Introduceti primul sir: "); gets (sir1); printf ("Introduceti al doilea sir: "); gets (sir2); strcpy (sir, sir1); strcat (sir, sir2); printf ("Ati introdus: %s \n", sir);

7.3

Probleme rezolvate

Exemplu: Programul urmtor citete de la tastatur un nume i determin dac este nume de fat sau de biat (toate numele de fat, cu excepia numelui "Carmen" se termin cu o vocal): #include <stdio.h> #include <string.h> #include <ctype.h> /* pentru toupper */

Programarea Calculatoarelor

Capitolul 7 iruri de caractere

int main (void) { char nume [80]; int n; char c; do { printf ("Introduceti numele: "); gets (nume); n = strlen (nume); }while (n == 0); /* nu permitem introducerea unui sir vid */ c = toupper (nume [n 1]); if ((c=='A')||(c=='E') || (c=='I') || (c=='O')) printf ("Nume de fata \n"); else printf ("Nume de baiat \n"); return 0; } Exemplu: urmtorul program citete de la tastatur un ir de caractere i afieaz irul n ordine invers: #include <stdio.h> #include <string.h> int main (void) { char sir [80]; int k, n; printf ("Introduceti sirul: "); gets (sir); n = strlen (sir); for (k = n - 1; k >= 0; k--) printf ("%c", sir [k]); printf ("\n"); return 0; } Exemplu: urmtorul program citete un ir de caractere reprezentnd un numr n baza 2 i afieaz valoarea acestuia n baza 10: #include <stdio.h> #include <string.h> int main (void) { char sir [80]; int k, n, val, p, cifra, valid;

Programarea Calculatoarelor

Capitolul 7 iruri de caractere

do { do { printf ("Introduceti sirul: "); gets (sir); n = strlen (sir); }while (n == 0); valid = 1; for (k = 0; k < n; k++) if ((sir [k] != '0') && (sir [k] != '1')) valid = 0; if (!valid) printf ("Sirul introdus nu este numar in baza 2 ! \n"); }while (!valid);

p = 1; val = 0;

/* puterea lui 2 */ /* valoarea numarului */

for (k = n - 1; k >= 0; k--) { cifra = sir [k] '0'; val = val + cifra * p; p = p * 2; } printf ("Numarul %s in baza 10 este: %d \n",sir,val); return 0; }

7.4
1. 2.

Probleme propuse

S se scrie un program C care s citeasc de la tastatur un cuvnt i s verifice dac respectivul cuvnt este palindrom (cuvnt care poate fi citit de la stnga la dreapta i de la dreapta la stnga fr s-i piard sensul: cojoc, capac, rar). S se scrie un program C care s citeasc de la tastatura N iruri de caractere (N < 10, introdus de la tastatura) i afieaz cel mai mare dintre iruri din punct de vedere alfabetic. Indicatie: Un tablou de iruri de caractere se declar ca un tablou bidimensional: char tab [10][80];

Variabila tab are alocat spaiu pentru 10 iruri de caractere, fiecare ir avnd lungimea maxim de 79 de caractere + terminatorul de ir. Primul ir este tab [0], ultimul este tab [9]. 3. S se scrie un program C care realizeaz urmtoarele: a) terge dintr-un ir de caractere un subir specificat prin poziie i lungime. b) Insereaz ntr-un ir ncepnd cu o poziie dat un al ir. c) Citete doua cuvinte i nlocuiete ntr-un text introdus de la tastatur toate apariiile primului cuvnt prin cel de-al doilea. 4. S se citeasc un text de la tastatur care se ncheie cu .. S se afieze cel mai lung cuvnt din text (dac sunt mai multe cu aceeai lungime maxim se va afia doar unul dintre ele).

Programarea Calculatoarelor

Capitolul 7 iruri de caractere

5. 6.

S se implementeze funciile strlen, strcpy, strcmp, strstr, strcat. S se scrie un program n C care s permit gestiunea crilor dintr-o bibliotec, prin intermediul unui meniu interactiv cu urmtoarele opiuni: 1) Adugare carte (titlu i autor) 2) Cutare dup titlu 3) Cutare dup autor 4) tergere carte 5) Ieire

7.5

ntrebri recapitulative:

1) Care este lungimea pe care o alegem n cazul n care vrem s citim de la tastatur un ir de 10 caractere? De ce? 2) Dai exemple de funcii cu care se pot citi iruri de caractere. Precizai diferenele dintre funcii. 3) Cum se compar dou iruri de caractere? 4) Cum se poate afla lungimea unui ir de caractere? 5) Cum se poate copia un ir de caractere ntr-un alt ir?

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