PC Laborator 8
Obiective
în urma acestui laborator, studentul va fi capabil să:
- înțeleagă cum funcționează șirurile de caractere
- facă operații cu șiruri de caractere
Șiruri de caractere
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). Declararea unui șir de caractere se face astfel:
char numele_sirului [numarul_de_caractere];
Operații cu șiruri
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor.
Aflarea lungimii unui șir de caractere
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului.
Sintaxa generala:
lungime_sir = strlen (sir_de_caractere);
Citirea unui șir de caractere
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere.
1. Sintaxa generala:
char sir_de_caractere[MAX_SIZE];
int i;
for (i = 0; i < MAX_SIZE; i++) {
scanf ("%c", &sir_de_caractere [i]);
}
2. Sintaxa generala
char sir_de_caractere[MAX_SIZE];
scanf ("%s", sir_de_caractere);
3. Sintaxa generala:
char sir_de_caractere[MAX_SIZE];
gets(sir_de_caractere);
Afișarea unui șir de caractere
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează: 1. Sintaxa generala:
char sir_de_caractere[MAX_SIZE];
int i;
for (i = 0; i < MAX_SIZE; i++) {
printf ("%c", &sir_de_caractere [i]);
}
2. Sintaxa generala
char sir_de_caractere[MAX_SIZE];
printf ("%s", sir_de_caractere);
3. Sintaxa generala:
char sir_de_caractere[MAX_SIZE];
puts(sir_de_caractere);
Exemplu: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.
Căutarea unui caracter într-un șir de caractere
Funcția folosită: strchr(); Sintaxa generala:
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;
int pozitie;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;
- Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică.
- Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași.
Copierea unui șir de caractere în altul
Funcția folosită: strcpy (); Sintaxa:
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];
strcpy (destinatie, sursa);
MAX_SIZE1 >= strlen (sursa);
Concatenarea unor șiruri de caractere
Funcția folosită: srtcat(); Sintaxa generala: char destinatie[MAX_SIZE1], sursa[MAX_SIZE2]; strcat (destinatie, sursa);
MAX_SIZE1 >= strlen (sursa) + strlen (destinatie);
Compararea a doua șiruri de caractere
Funcția folosită: strcmp(); Sintaxa generala:
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];
int rezultat;
rezultat = strcmp (sir1, sir2);
Funcția strcmp(); întoarce următoarele valori:
- -1 dacă sir1 este înainte din punct de vedere alfabetic;
- 0 dacă cele două șiruri sunt identice;
- +1 dacă sir2 este înainte din punct de vedere alfabetic.
Inserția unui șir de caractere într-un alt șir
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele:
- declarăm cele două șiruri;
- verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial;
- găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus;
- începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus;
- pe pozițiile rămase "goale" introducem șirul nou.
Exemplu: Transformați fraza "Studentul a picat examenul final." în "Studentul nu a picat examenul final." Date necesare: sir_inițial[50] = "Sudentul a picat examenul final.", sir_nou[3] = "nu ".
Observație: strlen vs sizeof
#include <stdio.h>
#include <string.h>
int main()
{
char str1[20] = "StringLab";
int len,size;
len=strlen(str1);
size=sizeof(str1);
printf("Lungimea str1: %d\n", len);
printf("Lungimea total alocata str1: %d\n", size);
return 0;
}
Exemple operații cu șiruri
#include <stdio.h>
#include <string.h>
int main () {
char str1[10] = "Hello";
char str2[10] = "String Lab";
char str3[10];
int len ;
/* copiaza str1 in str3 */
strcpy(str3, str1);
printf("strcpy( str3, str1) : %s\n", str3 );
/* concateneaza str1 str2 */
strcat( str1, str2);
printf("strcat( str1, str2): %s\n", str1 );
/* lungimea str1 dupa concatenare */
len = strlen(str1);
printf("strlen(str1) : %d\n", len );
return 0;
}
Exemple gets/puts
#include <stdio.h>
#include <string.h>
int main(){
char nume[30];
printf("Numele este: ");
/* Citește string de la utilizator */
gets(name);
printf("Nume: ");
/* Afișează string */
puts(nume);
return 0;
}
Exerciții
- Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.
- Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.