Documente Academic
Documente Profesional
Documente Cultură
2021
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
►1. Determinarea lungimii unui şir de caractere: size_t strlen (char * şir);
acelaşi cu „destinaţie”
- copiază şi ‘\0’ din sursă;
- trebuie alocat spaţiu de memorie pentru şirul destinaţie, mai întâi! Altfel, se
pot supraînscrie anumite valori aflate deja în memorie.
- Exemple (vor fi prezentate 2 variante de funcţii asemănătoare celei de
bibliotecă şi un exemplu simplu de utilizare a funcţiei de bibliotecă):
Var. 1
void copiază_şir (char dest[ ], char sursa[ ] )
9_159_1.c
{ int k;
for( k=0; sursa[k]; k++)
dest[k] = sursa[k];
dest[k] = ‘\0’;
return;
}
Var. 2
void copiază_şir (char * dest, char * sursa) 9_159_2.c
{ while( *dest++ = *sursa++)
; /*instrucţiune vidă sau continue;*/
return; valoarea expresiei de atribuire devine 0 când se ajunge la
sfârşitul şirului (‘\0’)
}
idem strcpy()
- copiază cel mult n caractere din „sursă” în „destinaţie”;
- dacă sursa are <n caractere → se adaugă caracterul ’\0’ până la n;
- dacă sursa are >n caractere → nu se adaugă caracterul ’\0’ în „destinaţie”
160
Daniela Saru - Programarea Calculatoarelor. Note de curs Editura Printech, 2011 - rev. 2021
#include <stdlib.h> 9_161.c
#include <stdio.h>
#include <string.h>
void main (void)
{ char sursa [ ] = "Şirul sursă.";
char * dest;
161
Daniela Saru - Programarea Calculatoarelor. Note de curs Editura Printech, 2011 - rev. 2021
- Exemple (vor fi prezentate: o variantă de funcţie asemănătoare celei
de bibliotecă şi un exemplu simplu de utilizare a funcţiei de
bibliotecă):
/*funcţie pentru compararea a două şiruri de caractere*/ 9_162_1.c
int compară_şiruri(char şir1[ ], char şir2[ ])
{ int i=0;
while(şir1[i] == şir2[i] && şir1[i] != ‘\0’ && şir2[i] != ‘\0’)
i++; /* se parcurg cele 2 şiruri până când fie caracterele nu mai
coincid, fie se termină unul dintre cele 2 şiruri */
if (şir1[i] < şir2[i])
return -1; /* concluzie: „şir1” < „şir2” */
else if (şir1[i] == şir2[i])
return 0; /* concluzie: „şir1” == „şir2” */
else return 1; /* concluzie: „şir1” > „şir2” */
}
Pe ecran:
The first string.
The second string.
Tastaţi numărul de caractere ce trebuie comparate sau 0 pentru încheiere: 3
Comparând 3 caractere, strncmp() returnează: 0
Tastaţi numărul de caractere ce trebuie comparate sau 0 pentru încheiere: 6
Comparând 6 caractere, strncmp() returnează: -1
Tastaţi numărul de caractere ce trebuie comparate sau 0 pentru încheiere: 0
163
Daniela Saru - Programarea Calculatoarelor. Note de curs Editura Printech, 2011 - rev. 2021
►5. Căutări în şiruri de caractere
- se stabileşte dacă un şir de caractere sau un caracter apare în alt şir de
caractere şi „unde” apare
Pe ecran:
Tastaţi şirul în care se face căutarea: Astăzi este vreme frumoasă.
Tastaţi caracterul ce trebuie căutat: e
Caracterul e a fost găsit în poziţia 7.
164
Daniela Saru - Programarea Calculatoarelor. Note de curs Editura Printech, 2011 - rev. 2021
#include <stdio.h>
9_165_1.c
#include <string.h>
void main (void)
{ char buf1 [80], buf2 [80];
size_t loc;
printf("Tastaţi şirul în care se face căutarea: ");
gets(buf1);
printf("Tastaţi şirul ce conţine caracterele ce trebuie căutate: ");
gets(buf2);
loc = strcspn(buf1, buf2); /*returnează prima poziţie în care găseşte unul
dintre caracterele cautate*/
if ( loc == strlen(buf1) )
printf("Nu a fost găsit nici un caracter!");
else
printf("Prima potrivire a fost găsită în poziţia %d\n", loc);
}
Pe ecran:
Tastaţi şirul în care se face căutarea: Astăzi este luni.
Tastaţi şirul ce conţine caracterele ce trebuie căutate: cer
Prima potrivire a fost găsită în poziţia 7.
- Exemple:
o funcţie ce poate fi folosită în locul celei de bibliotecă, dar
care returnează poziţia şi nu adresa de memorie a primei
apariţii,
un exemplu simplu de utilizare a funcţiei de bibliotecă):
166
Daniela Saru - Programarea Calculatoarelor. Note de curs Editura Printech, 2011 - rev. 2021
/* exemplu simplu de utilizare a funcţiei de bibliotecă strstr() */
9_167.c
#include <stdio.h>
#include <string.h>
void main (void)
{ char *loc, buf1[80], buf2[80];
printf("Tastaţi şirul în care se face căutarea: ");
gets(buf1);
printf("Tastaţi şirul ce trebuie căutat: ");
gets(buf2);
loc = strstr(buf1, buf2); /*returnează o adresă de memorie sau NULL*/
if ( loc == NULL )
printf("Nu a fost găsit!");
else
printf("%s a fost găsit în poziţia %d\n", buf2, loc-buf1);
}
167
Daniela Saru - Programarea Calculatoarelor. Note de curs Editura Printech, 2011 - rev. 2021
Să se înlocuiască într-un şir de caractere dat toate apariţiile unui subşir „vechi” cu un
alt subşir „nou”. Sirurile de caractere se citesc de la tastatură iar şirul rezultat se
afişează pe ecran.
vechi
s lim s p p + lv
168
Daniela Saru - Programarea Calculatoarelor. Note de curs Editura Printech, 2011 - rev. 2021
OBSERVAŢIE:.
Pentru acest exemplu se face demonstratie “live” la ora de curs (varianta corecta si
varianta incorecta):
SiruriCar_detalii.C
Dacă, în locul instrucţiunii
s=p+lv;
se scrie grupul de instrucţiuni
puts("sirul rezultat (temporar):");
puts(rez);
getch();
s=p+lv;
se poate vizualiza evoluţia treptată a construirii (corecte) a şirului rezultat.
169
Daniela Saru - Programarea Calculatoarelor. Note de curs Editura Printech, 2011 - rev. 2021
►5. Căutări în şiruri de caractere (din ed. rev. nov. 2014)
Pe ecran:
Separarea sirului "- Iata, un exemplu. De text!." in subsiruri delimitate de ",.-":
170
Daniela Saru - Programarea Calculatoarelor. Note de curs Editura Printech, 2011 - rev. 2021
Iata
un exemplu
De text!
Asa se afiseaza acum, cu printf(), sirul initial: - Iata
Asa se afiseaza caracterul nul: A A
Iata ce contine la final sirul initial (afisat caracter cu caracter):
- Iata un exemplu De text
Pe ecran:
Introduceti textul (cel mult 100 de caractere):
Cerul, albastru si senin, se zareste bine acum. Ajungem la destinatie.
Cuvintele din text sunt:
Cerul
albastru
si
senin
se
zareste
bine
acum
Ajungem
la
destinatie
171
Daniela Saru - Programarea Calculatoarelor. Note de curs Editura Printech, 2011 - rev. 2021
- Problemă rezolvată: De la tastatură se citeşte un text care conţine
cuvinte separate prin spaţiu, virgulă sau punct. Se cere să se
afişeze cuvintele textului în ordine lexicografică (adică la fel ca în
dicţionar; se respectă ordinea caracterelor din setul ASCII). Pentru
rezolvare, se sugerează să se separe cuvintele textului folosind
funcţia strtok() şi să fie memorate, treptat, într-un tablou ale cărui
elemente să fie şiruri de caractere. Ordonarea se va aplica apoi
asupra elementelor tabloului.
Pe ecran:
Scrieti textul ce trebuie prelucrat (max. 100 de caractere):
Marea este albastra. Frunzele sunt verzi.
-------- Rezolvarea a fost preluată şi adaptată dintr-o sursă World Wide Web
173