Șiruri de caractere și funcțiile predefinite (doar matematică-informatică)
Doar la matematică-informatică. Cum e memorat un șir, de ce s+3 e tot un șir și ce fac strlen, strcpy, strcat, strcmp, strchr, strstr. Extragere, inserare, eliminare, conversii și urmărirea secvențelor din lucrări.
- 26 min
- La BAC: I · Subiectul al II-lea, 2 · Subiectul al II-lea, 3 · Subiectul al III-lea, 2
- De revizuit

ții minte doar fișa asta și ești acoperit
Fișa de aur
- 01
Doar la matematică-informatică. Șirurile nu sunt în programa de la științe ale naturii.
- 02
Șirul se termină cu caracterul nul. Pentru cel mult 100 de caractere, declară char s[101].
Truc: Mereu cu un loc în plus.
- 03
s+3 este șirul de la poziția 3 încolo. Pozițiile încep de la 0.
- 04
strchr și strstr întorc adresă, nu poziție. Poziția se obține cu strchr(s,c)-s. Dacă nu găsesc, întorc NULL.
- 05
strcmp(a,b)>0 înseamnă că a e după b în ordine lexicografică. Pentru egalitate: strcmp(a,b)==0.
- 06
cin>>s citește până la primul spațiu; cin.getline(s,101) citește toată linia.
Pe scurt
Culorile din lecție:termencifră, datăidee-cheie
- Lecția e doar pentru matematică-informatică.
- Un șir este un tablou de caractere, încheiat cu caracterul nul.
s+kînseamnă „șirul care începe la pozițiak”.- Funcțiile
strlen,strcpy,strcat,strcmp,strchr,strstrsunt în<cstring>. - În lucrări le urmărești de mână, în secvențe scurte, și le folosești în programe.
Cum e memorat un șir
Când scrii un nume într-un formular cu căsuțe, căsuțele goale de la sfârșit nu fac parte din nume. La un șir, o căsuță specială spune unde se termină: caracterul nul, scris '\0'.
char s[11]="bac2027";
| Poziție | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| Caracter | b | a | c | 2 | 0 | 2 | 7 | nul |
Oficial: tipul șir de caractere. Dimensiunea trebuie să aibă loc și pentru caracterul nul: pentru „cel mult 100 de caractere” declari char s[101];.
Două idei ajută la tot restul lecției:
s[i]este un caracter; se scrie între apostrofuri:s[0]=='b'.s+3este adresa poziției 3. Orice funcție care primeștes+3lucrează cu șirul2027.
Citire și afișare
InstrucțiuneCe citește
cin>>s;cin.getline(s,101);cout<<s;cout<<s+3;| Instrucțiune | Ce citește |
|---|---|
cin>>s; | un cuvânt, până la primul spațiu sau Enter |
cin.getline(s,101); | toată linia, cu spații, cel mult 100 de caractere |
cout<<s; | afișează șirul, până la caracterul nul |
cout<<s+3; | afișează de la poziția 3 |
Lucrările dau secvențe și cu printf("%s",s);. Funcția veche gets a fost scoasă din standardele noi de C și C++, deci nu te baza pe ea.
Funcțiile predefinite
strlen(s)strlen(s)strcpy(d,s)s în dstrcpy(d,s+3)d este alaureatstrcat(d,s)strcpy(d,"bac"); strcat(d,"2027")d este bac2027strcmp(a,b)strcmp("soare","ploaie")strchr(s,c)strchr(s,'l')strstr(s,t)strstr(s,"la")| Funcție | Face | Exemplu, cu s="bacalaureat" | Rezultat |
|---|---|---|---|
strlen(s) | lungimea | strlen(s) | 11 |
strcpy(d,s) | copiază s în d | strcpy(d,s+3) | d este alaureat |
strcat(d,s) | adaugă la final | strcpy(d,"bac"); strcat(d,"2027") | d este bac2027 |
strcmp(a,b) | ordine lexicografică | strcmp("soare","ploaie") | pozitiv |
strchr(s,c) | caută un caracter | strchr(s,'l') | adresa poziției 4 |
strstr(s,t) | caută un șir | strstr(s,"la") | adresa poziției 4 |
strchr și strstr întorc o adresă. Dacă nu găsesc, întorc NULL. Scăzând adresa de început, obții poziția: strchr(s,'l')-s este 4.
Cum verifici că t e prefix al lui s, cu strstr?
Extragere, inserare, eliminare, conversii
Programa le numește pe toate, deși în C/C++ nu există o funcție pentru fiecare. Le construiești din cele de mai sus. Programul următor le arată pe toate, iar ieșirea e sub el.
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{ char s[51],t[51],aux[51];
strcpy(s,"bacalaureat");
cout<<strlen(s)<<endl;
strcpy(t,s+3);
cout<<t<<endl;
strncpy(t,s,3);
t[3]='\0';
cout<<t<<endl;
strcat(t,"2027");
cout<<t<<endl;
strcpy(aux,s+3);
strcpy(s,aux);
cout<<s<<endl;
strcpy(aux,s+2);
s[2]='\0';
strcat(s,"XY");
strcat(s,aux);
cout<<s<<endl;
cout<<strchr(s,'X')-s<<endl;
cout<<atoi("2027")+1<<endl;
return 0;
}
11
alaureat
bac
bac2027
alaureat
alXYaureat
2
2028
Operație din programăCum o faci în C/C++
strncpy(t,s+i,k); t[k]='\0';k caractere de la poziția istrcpy(aux,s+i+k); strcpy(s+i,aux);x la poziția istrcpy(aux,s+i); s[i]='\0'; strcat(s,x); strcat(s,aux);atoi(s), din <cstdlib>; sau de mână: n=n*10+(s[i]-'0');sprintf(s,"%d",n);, din <cstdio>| Operație din programă | Cum o faci în C/C++ |
|---|---|
| Extragere | strncpy(t,s+i,k); t[k]='\0'; |
Eliminare a k caractere de la poziția i | strcpy(aux,s+i+k); strcpy(s+i,aux); |
Inserare a lui x la poziția i | strcpy(aux,s+i); s[i]='\0'; strcat(s,x); strcat(s,aux); |
| Șir în număr | atoi(s), din <cstdlib>; sau de mână: n=n*10+(s[i]-'0'); |
| Număr în șir | sprintf(s,"%d",n);, din <cstdio> |
Oficial: secvențe de urmărit
Sesiunea specială 2026, varianta 4, II.2 (6 p). Se cere ce afișează:
strcpy(s,"anatoliana"); strcpy(t,"ana");
cout<<strlen(s)<<' ';
if(strstr(s,t)==s) cout<<"DA ";
else cout<<"NU ";
if(strcmp(strstr(s+1,t),t)==0) cout<<"DA";
else cout<<"NU";
- strlen(s)
anatoliana are 10 litere.
- strstr(s,t)==s
Prima apariție a lui ana e chiar la început, deci adresa ei e s. Se afișează DA.
- strstr(s+1,t)
De la poziția 1 încolo, șirul e natoliana. Prima apariție a lui ana e la capăt, deci rezultatul e șirul ana.
- strcmp(...,t)==0
ana comparat cu ana dă 0. Se afișează DA.
Răspuns: 10 DA DA. Barem: câte 2 p pentru fiecare dintre cele trei valori.
Rezervă 2025, varianta 7, II.3 (6 p). Se cer șirul s1 și valoarea n:
strcpy(s1,"parcarea");
strcpy(s2,strstr(s1,"car"));
n=strlen(s2);
strcpy(s1+n-2, s2+n-2);
PasRezultat
strstr(s1,"car")car până la capăt, deci s2 devine carean=strlen(s2)s2+n-2s2+3, adică eas1+n-2s1strcpy(s1+3,"ea")s1 devine par + ea = parea| Pas | Rezultat |
|---|---|
strstr(s1,"car") | de la car până la capăt, deci s2 devine carea |
n=strlen(s2) | 5 |
s2+n-2 | s2+3, adică ea |
s1+n-2 | poziția 3 din s1 |
strcpy(s1+3,"ea") | s1 devine par + ea = parea |
Răspuns: parea și 5. Barem: câte 3 p.
Trei itemi de grilă, cu răspunsul din barem:
strcpy(s,"calculator"); k=strchr(s,s[1])-strchr(s,s[3]);s[1] e a, poziția 1; s[3] e c, prima apariție la poziția 0. d: 1strcpy(x,"soare"); strcpy(y,"ploaie"); if(strcmp(x,y)>0) strcpy(s,x+1); else strcpy(s,y+2);s e după p, deci s devine x+1. a: oarestrcpy(s,"2019"); strcpy(s+3,"23");23. a: 20123| Lucrare | Secvență | Răspuns |
|---|---|---|
| August 2025 var. 4, I.2 | strcpy(s,"calculator"); k=strchr(s,s[1])-strchr(s,s[3]); | s[1] e a, poziția 1; s[3] e c, prima apariție la poziția 0. d: 1 |
| August 2024 var. 8, I.3 | strcpy(x,"soare"); strcpy(y,"ploaie"); if(strcmp(x,y)>0) strcpy(s,x+1); else strcpy(s,y+2); | s e după p, deci s devine x+1. a: oare |
| August 2023 var. 7, I.3 | strcpy(s,"2019"); strcpy(s+3,"23"); | de la poziția 3 scrie 23. a: 20123 |
Iunie-iulie 2023, varianta 5, I.3. După strcpy(s,"bac2023"); s[s[2]-'a']='\0'; k=strlen(s);, s[2] e c, iar 'c'-'a' e 2. Deci s[2] devine caracterul nul, iar șirul rămâne ba. c: k are valoarea 2.
Ce valoare are strlen("anatoliana")?
Care e valoarea lui strchr(s,s[1])-strchr(s,s[3]) pentru calculator?
Oficial: o secvență de scris
Rezervă 2026, varianta 5, II.3 (6 p). s memorează POP Grigore, nume și prenume separate printr-un spațiu, iar t e vid. Se construiește în t: Prof. Grigore POP.
char *p;
p=strchr(s,' ');
strcpy(t,"Prof. ");
strcat(t,p+1);
strcat(t," ");
*p='\0';
strcat(t,s);
p e adresa spațiului, deci p+1 e prenumele. Punând caracterul nul în locul spațiului, s rămâne doar numele.
Barem: câte 1 p pentru identificarea unui cuvânt, constanta pentru titlu, adăugarea sau inserarea unui subșir, cuvintele și simbolurile păstrate, obținerea în memorie; 1 p pentru declarări și corectitudine globală.
Ce se cere la BAC
- Subiectul I: o secvență scurtă de urmărit, ca la august 2025, august 2024 și în ambele sesiuni din 2023 citate mai sus.
- II.2 sau II.3: o secvență de urmărit sau de scris.
- III.2: program cu text, în lecția următoare.
Greșeli care costă puncte
- Te încurci cu poziția: indexarea e de la 0.
- Uiți caracterul nul după
strncpysau când construiești un șir pe caractere. strchrluat drept poziție: el întoarce o adresă.- Compari șiruri cu
==. - Dimensiunea fără loc pentru caracterul nul.
- Citești un text cu
cin>>sși păstrezi doar primul cuvânt.
Termeni-cheie
- Șir de caractere
- Tablou de char, încheiat cu caracterul nul. Dimensiunea trebuie să includă și acest caracter.
- Caracterul nul
- Caracterul cu codul 0, scris între apostrofuri cu backslash și zero. Marchează sfârșitul șirului.
- strlen
- Numărul de caractere ale șirului, fără caracterul nul.
- strcpy
- Copiază un șir peste altul: strcpy(destinație, sursă).
- strcat
- Adaugă al doilea șir la sfârșitul primului (concatenare).
- strcmp
- Compară lexicografic două șiruri: rezultat negativ, zero sau pozitiv.
- strchr
- Caută un caracter într-un șir și întoarce adresa primei apariții, sau NULL.
- strstr
- Caută un șir în alt șir și întoarce adresa primei apariții, sau NULL.
- atoi
- Transformă un șir de cifre în valoare numerică întreagă.
Notițele mele
Salvat localSurse
- Programa de examen Informatică (OMECTS 4800/2010, anexa 2), pct. 4.2
- BAC 2026, sesiunea specială, varianta 4, MI: II.2, cu barem
- BAC 2025, rezervă iunie, varianta 7, MI: II.3, cu barem
- BAC 2025, sesiunea august, varianta 4, MI: I.2, cu barem
- BAC 2024, sesiunea august, varianta 8, MI: I.3, cu barem
- BAC 2023, sesiunea august, varianta 7, MI: I.3, cu barem
- BAC 2023, sesiunea iunie-iulie, varianta 5, MI: I.3, cu barem
- BAC 2026, rezervă iunie-iulie, varianta 5, MI: II.3, cu barem