Documente Academic
Documente Profesional
Documente Cultură
Şiruri de caractere
Declarare, iniţializare, constante şir de caractere
Operaţii la nivel de caracter
Operaţii cu şiruri de caractere
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 147
9.1 Declarare, iniţializare, constante şir de caractere
printf(“Bună ziua!”);
tablou de caractere char cuvânt [ ] = {‘s’, ‘a’, ‘l’, ‘u’, ‘t’, ‘!’};
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 147
Folosind doar cunoştinţele de programare deja acumulate, scrierea unei funcţii care să
concateneze 2 şiruri de caractere (şir1 şi şir2), s-ar putea face, de exemplu, numai cu
condiţia ca „lungimile” celor 2 şiruri (numărul lor de elemente) să fie cunoscute:
Demonstratie: 9_148.C
void concat (char rez[ ], char sir1[ ], int n1, char sir2[ ], int n2)
{ int i;
for( i=0; i<n1; i++) rez[i] = sir1[i]; /* copiază şir1 în rez*/
for( i=0; i<n2; i++) rez[n1+i] = sir2[i]; /* copiază şir2 în rez în continuarea lui şir1*/
}
#include <stdio.h>
int main()
{ char s1[5] = {‘F’, ‘u’, ‘n’, ‘c’, ‘ţ’};
char s2[7] = {‘i’, ‘o’, ‘n’, ‘e’, ‘a’, ‘z’, ‘ă’};
char s3[20]; /*dezavantaj: trebuie specificată o dimensiune acoperitoare*/
int i, n, n1=5, n2=7;
n=n1+n2;
concat(s3, s1, n1, s2, n2);
for( i=0; i<n; i++)
printf(“%c”, s3[i]);
printf(“\n”);
return 0;
}
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 148
Particularitate:
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 148
Exemple de utilizare a caracterului nul: scrierea unei funcţii ce determină numărul
de caractere utile dintr-un şir (mai multe variante de implementare).
Demonstratie: 9_149.C
int lung_sir( char sir[ ] )
{ int k = 0;
while( sir[k] != ‘\0’ ) echivalent cu while( sir[k] ) ++k;
++k;
return k; vezi corespondenţa 0 --- ’\0’
}
sau
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 149
sau
sau
sau
Folosirea funcţiei din biblioteca string.h, strlen(sir_caractere), care
returnează ca rezultat lungimea şirului de caractere fară caracterul nul, de
sfârşit. Într-o secţiune separată a acestui capitol vor fi detaliate câteva dintre
cele mai folosite funcţii din această bibliotecă a compilatorului C.
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 149
Constante şir de caractere
sau echivalent cu
char cuvant[ ] = {‘S’, ‘a’, ‘l’, ‘u’, ‘t’, ‘\0’}; => dimensiune 6
char cuvant[6]=“Salut”;
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 150
Şirul nul de caractere
este un şir de caractere care conţine doar caracterul nul ( ‘\0’ )
Exemplu:
char cuvant[10] = ””; /*se scriu doar ghilimelele (fără spaţiu intre ele)*/
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 151
Secvenţe escape (caractere speciale)
Demonstratie: 9_151_152.C
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 151
Scrierea unei constante şir de caractere pe linii successive
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 152
9.2 Operaţii la nivel de caracter
Citire de la tastatură
Scriere pe ecran
Comparaţii şi operaţii aritmetice
9.2.1 Citire de la tastatură
char car;
scanf(“%c”, &car); (obisnuit) dar uneori apar probleme daca in program
trebuie citite si date numerice (vezi Exemplu – pe slide-ul urmator – prezentat
„live” la curs!)
int getchar(void) => funcţie specializată, nu necesită format de citire.
Caracterul citit este pus in octetul mai puţin semnificativ (pentru
compatibilitatea cu versiunile de compilatoare mai vechi).
Ex: car = getchar(); aşteaptă ENTER pentru a se executa
int getche(void) => spre deosebire de getchar(), preia caracterul tastat fără a
mai aştepta ENTER. Nu face parte din stdio.h, ci din
conio.h
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 152
Demonstratie: sir_scanf.C
#include <stdio.h>
#include <conio.h>
int main(void)
{ int i;
float x;
char car;
car='D';
while(car=='D' || car=='d')
{printf("Tastati 2 numere: unul intreg si unul real\n");
scanf("%d%f", &i, &x);
printf("Numerele tastate au fost: %d si %f\n", i, x);
printf("Continuati? (D/N):");
scanf("%c",&car);
}
return 0;
}
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 153
Acelasi exemplu, dar cu variante de scriere: Demonstratie: sir_scanf_bis.C
#include <stdio.h>
#include <conio.h>
int main(void)
{ int i;
float x;
char car;
car='D';
while(car=='D' || car=='d')
{printf("Tastati 2 numere: unul intreg si unul real\n");
scanf("%d%f", &i, &x);
printf("Numerele tastate au fost: %d si %f\n", i, x);
printf("Continuati? (D/N):");
/*fflush(stdin);*/
/*scanf("%c",&car);*/ /*Apare singura --> functionare defectuoasa!
Apare precedata de fflush(stdin); --> functionare OK*/
/*scanf("%c%c",&car,&car);*/ /*Apare in locul celor 2 anterioare --> OK*/
/*car=getche();*/ /*Apare singura --> functionare OK */
}
return 0;
}
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 153
9.2.2 Scriere pe ecran
printf(“%c”, car);
În limbajul C, o constantă sau o variabilă de tip char care apare într-o expresie este
convertită automat la valoarea int ce corespunde reprezentării interne (ASCII) a
caracterului (numărul de ordine în set).
Din acest motiv, expresia car>=‘a’ && car<=‘z’ este CORECTĂ şi verifică faptul că
variabila car este sau nu caracter literă mică.
Formă de scriere echivalentă: car>=97 && car<=122 (coduri ASCII, in baza 10)
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 154
Conversiile automate caracter-cod ASCII
8 = 56 – 48;
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 154
Ex: funcţie de conversie a unui şir de caractere (text) în număr întreg (valoare de tip int).
Exemplul este doar ilustrativ, nu asigura functionalitatea completa pentru rezolvarea
problemei propuse.
int sir_la_intreg (char sir[ ])
{ int i, val_int, rez = 0;
for(i = 0; sir[i] >= ‘0’ && sir[i] <= ‘9’; i++)
{ val_int = sir[i] – ‘0’;
rez = rez*10 + val_int;
}
return rez;
}
void main( )
{ printf(“%d\n”, sir_la_intreg(“245”));
printf(“%d\n”, sir_la_intreg(“100”) + 25);
printf(“%d\n”, sir_la_intreg(“13*5”));
nu este cifră!!!
}
Datorita modului in care a fost conceputa functia de conversie (se iese din ciclul for
daca se gaseste un caracter care nu este cifra) pe ecran apar urmatoarele rezultate:
245
125
13 Demonstratie: 9_155.C
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 155
Funcţii de bibliotecă ce realizează conversii, descrise in stdlib.h:
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 155
Macro-definiţii de bibliotecă (notiunea va fi explicata intr-un capitol urmator), descrise
in ctype.h, ce testează categoria din care face parte un anumit caracter (litera, cifra,
caracter de punctuatie etc.) sau transforma valoarea caracterului:
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 156
9.3 Operaţii cu şiruri de caractere
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 156
9.3.1 Afişarea şirurilor de caractere prin functii standard
char cuvant[25]=”Demonstratie”;
adresa de început a şirului de caractere ce trebuie afişat
printf(”%s\n”, cuvant ); /*apelarea funcţiei*/
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 157
9.3.2 Citirea şirurilor de caractere de la tastatură
Demonstratie: 9_157.C
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 157
Funcţia de bibliotecă gets()
Demonstratie: 9_158.C
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 158
9.3.3 Funcţii de bibliotecă pentru operaţii cu şiruri de
caractere descrise în fisierul standard string.h
Operaţii:
determinarea lungimii unui şir de caractere;
copierea şi concatenarea şirurilor;
compararea şirurilor din punct de vedere lexicografic;
căutarea unor caractere în şir;
convertirea (transformarea) caracterelor din şir
OBS.
O parte dintre exemplele ce vor fi prezentate in aceasta sectiune au fost
preluate si adaptate din volumul “Teach Yourself C in 21 Days” - Bradley L.
Jones, Peter Aitken. Este vorba despre exemplele de utilizare a functiilor de
biblioteca.
Daniela Saru - "Programarea calculatoarelor. Note de curs” – Ed. Printech, 2011 / slides rev. 2021 158