next up previous contents
Next: Probleme rezolvate Up: Siruri de caractere Previous: Siruri de caractere   Cuprins


Observatii asupra sirurilor de caractere

Se impun facute câteva precizari asupra unor operatii cu siruri.

Prima precizare se refera la natura "duala" tablou-pointer (care va fi prezentata în capitolele urmatoare), motiv pentru care, în cazul citirii unui sir de caractere folosind functia scanf, nu este necesara folosirea operatorului de adresa & în fata variabilei sir (indiferent ca aceasta a fost declarata ca pointer la char sau ca tablou de caractere).

O recomandare de ordin "practic", impusa de maniera în care unele functii de intrare/iesire folosesc buffer-ul de intrare: se va evita folosirea functiei scanf pentru citirea unui singur caracter, mai ales dupa un alt apel al functiei scanf; se recomanda folosirea functiilor getch sau getche (nu getchar).

O alta problema în folosirea functiei scanf la citirea sirurilor de caractere apare la siruri care contin caractere de tip separator (spatii goale, tab-uri, etc.). Functia scanf va citi sirul doar pâna la primul caracter de acest tip.

Frecvent, programatorii obisnuiti cu limbajul Pascal si care "migreaza" la C fac o greseala importanta: compararea sirurilor folosind operatorii de comparatie aritmetici: $<$, $>$ si $==$. Din punct de vedere sintactic, nu se semnaleaza nici o eroare în timpul compilarii, dar în timpul executiei vor aparea comportari anormale ale programului. Cauza acestui fapt este ca folosind comparatii între siruri cu operatori aritmetici, se realizeaza, de fapt, o comparatie între adresele de memorie la care sunt stocate sirurile, si nu o comparatie efectiva între siruri. Pentru a compara siruri, trebuie folosite doar functiile dedicate (strcmp, strncmp).

O greseala asemanatoare este folosirea operatorului aritmetic de atribuire între siruri. În loc sa se efectueze copierea unui sir peste celalalt, dupa atribuirea aritmetica, cele doua variabile sir vor referi aceeasi zona de memorie (deoarece s-a realizat o atribuire de pointeri). Pentru atribuiri de siruri, se vor folosi functii specifice (strcpy, strncpy, bcopy, memcpy, memmove). Compilatorul nu va sesiza eroare decât daca cele doua siruri au fost declarate ca tablouri. Exemplul urmator ilustreaza aceasta greseala (operatia de alocare va fi explicata în capitolul dedicat pointerilor):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void){
   char * s1;
   char * s2;

   s1=(char *)malloc(20);  /* alocare dinamica, 20 caractere */
   s2=(char *)malloc(20);  /* echivalent cu declaratia: */
                           /* char s1[20], s2[20]; */ 

   strcpy(s1,"abcedfg");
   strcpy(s2,"mnopqrs");

   s1=s2;                    /* s1 si s2 vor referi 
                                acelasi sir de caractere */

   s1[3]='\0';               /* scurteaza pe s1 la 3 caractere */
   printf("%s\n%s\n",s1,s2); /* modificarea se va reflecta si */
                             /* asupra lui s2 */
}


next up previous contents
Next: Probleme rezolvate Up: Siruri de caractere Previous: Siruri de caractere   Cuprins
Cristian Gavrila 2001-10-02