Șiruri de caractere

Ș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
Ilustrație: Șiruri de caractere și funcțiile predefinite (doar matematică-informatică)
Ilustrație generată pentru ZECE (artistică, nu o planșă științifică: pentru detalii exacte vezi schemele din lecție).

ții minte doar fișa asta și ești acoperit

Fișa de aur

  1. 01

    Doar la matematică-informatică. Șirurile nu sunt în programa de la științe ale naturii.

  2. 02

    Șirul se termină cu caracterul nul. Pentru cel mult 100 de caractere, declară char s[101].

    Truc: Mereu cu un loc în plus.

  3. 03

    s+3 este șirul de la poziția 3 încolo. Pozițiile încep de la 0.

  4. 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.

  5. 05

    strcmp(a,b)>0 înseamnă că a e după b în ordine lexicografică. Pentru egalitate: strcmp(a,b)==0.

  6. 06

    cin>>s citește până la primul spațiu; cin.getline(s,101) citește toată linia.

1 din 9

Pe scurt

1 minesențialul, de recitit oricând

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ția k”.
  • Funcțiile strlen, strcpy, strcat, strcmp, strchr, strstr sunt î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

3 min

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";
Caracter
0
b
1
a
2
c
3
2
4
0
5
2
6
7
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+3 este adresa poziției 3. Orice funcție care primește s+3 lucrează cu șirul 2027.

Citire și afișare

2 min

InstrucțiuneCe 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

2 min o întrebare la final

strlen(s)
Face
lungimea
Exemplu, cu s="bacalaureat"
strlen(s)
Rezultat
11
strcpy(d,s)
Face
copiază s în d
Exemplu, cu s="bacalaureat"
strcpy(d,s+3)
Rezultat
d este alaureat
strcat(d,s)
Face
adaugă la final
Exemplu, cu s="bacalaureat"
strcpy(d,"bac"); strcat(d,"2027")
Rezultat
d este bac2027
strcmp(a,b)
Face
ordine lexicografică
Exemplu, cu s="bacalaureat"
strcmp("soare","ploaie")
Rezultat
pozitiv
strchr(s,c)
Face
caută un caracter
Exemplu, cu s="bacalaureat"
strchr(s,'l')
Rezultat
adresa poziției 4
strstr(s,t)
Face
caută un șir
Exemplu, cu s="bacalaureat"
strstr(s,"la")
Rezultat
adresa poziției 4
1 / 6

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

5 min

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++

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

8 min 2 întrebări la final

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";
  1. strlen(s)

    anatoliana are 10 litere.

  2. strstr(s,t)==s

    Prima apariție a lui ana e chiar la început, deci adresa ei e s. Se afișează DA.

  3. 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.

  4. 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")
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:

August 2025 var. 4, I.2
Secvență
strcpy(s,"calculator"); k=strchr(s,s[1])-strchr(s,s[3]);
Răspuns
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
Secvență
strcpy(x,"soare"); strcpy(y,"ploaie"); if(strcmp(x,y)>0) strcpy(s,x+1); else strcpy(s,y+2);
Răspuns
s e după p, deci s devine x+1. a: oare
August 2023 var. 7, I.3
Secvență
strcpy(s,"2019"); strcpy(s+3,"23");
Răspuns
de la poziția 3 scrie 23. a: 20123
1 / 3

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

3 min

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

1 mincum apare la examen

  • 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

1 mincapcanele de evitat

  • Te încurci cu poziția: indexarea e de la 0.
  • Uiți caracterul nul după strncpy sau când construiești un șir pe caractere.
  • strchr luat 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 local

Surse