You are on page 1of 15

Colegiul Naţional „Octav Onicescu ”

Sector 4, Bucure ti ș
Proiect pentru atestarea competen elor ț
profesionale
Prelucrarea sirurilor de
caractere
Îndrumător !utor
Prof"#oma Catalin elev $lei %lorin
&'(4
C$P)*NS
Pagina principala+++++++""""""""""""""""++""" ,
*ntroducere"""""""""""""""""""++++++""""""""""""""""+"" -
Citirea si tiparirea+++++++++"""""""""""""" (&
%unctii++++++++++++""""""""""""""+ (.
/0emple+++++++++++"""""""""""""""+ &4
2
Pagina principala
3
*N#)O1$C/)/
CARACTERISTICI GENERALE
O constanta de tip sir de caractere de declara intre doua caractere ''. In memoria interna, o constanta de acest
tip este retinuta sub forma unui ector de caractere. !iecare componenta a sirului "incepand cu cea de indice #$ retine
codul ASCII al caracterului pe care il memorea%a. Conentia este ca ultimul octet sa retina # "codul caracterului nul$.
Caracterul nul este memorat automat. Trebuie re%erate lungimea_sirului+& caractere c'ar "(& pentru caracterul nul$.
Limba)ul C*C(( permite initiali%area unui tablou de caractere printr+o constanta sir, care include automat
caracterul null.
Exemplu :
c'ar ect,&&-./calculator/0
c'ar ect,-./calculator/0 "compilatorul face calculul numarului de octeti necesari$
c'ar ect,&##-./calculator/0 "s+au re%erat mai multi octeti decat era necesar$
Sirurile de caractere sunt de fapt tablouri de caractere, care au ca ultim element un terminator de sir, caracterul
null.
Exemplu :
c'ar tc,1- . 2'a', 'b', 'c', 'd', 'e'30 ** tablou de caractere
c'ar sc,1- . 2'a', 'b', 'c', 'd', '4#'30 ** sir de caractere cu elementele abcd
5ltima initiali%are este ec'ialenta cu6
c'ar sc,1- . /abcd/0 **sau c'ar sc,- . /abcd/0
c'ar sc&,1- . /abcd/0
c'ar s,&#-0
cout77sc77endln0 **afisea%a abcd
cout77tc77endl0 **eroare6 tabloul de caractere nu contine terminatorul de sir, deci nu poate fi afisat ca sir
cout77s77endl0 ** eroare6 tablou neinitiali%at
cout77sc&,#-0 ** afisea%a primul caracter din sirul sc&
cout77sc&,8-0 ** afisea%a al treilea element din sirul sc&
ssc&,&-.�9�0 ** elementului din sir de indice & i se atribuie aloarea '9'
4
P)/2/N#!)/! !P3*C!4*/*
Un caracter se declară în C de forma: char a='a'; Pentru initializarea lui, se observă că am
pus un caracter între apostroafe.
Un şir de caractere presupune practic un vector de caractere. Cea mai simplă declaraţie
fiind: char a[10]= “cuvant”; Pentru iniţializarea unui şir de caractere, spre deosebire de un
singur caracter am folosit gilimelele.
Cum s!a prezentat anterior, o variabilă vector conţine adresa de început a vectorului"adresa
primei componente a vectorului#, şi de aceea este ecivalentă cu un pointer la tipul elementelor
din vector. $eci declaraţiile de mai %os vor declara fiecare cate un şir de caractere:
char a[5];
char *b="unsir";
char *c;
$iferenţa între ele este însa că primele două declaraţii vor aloca & pozitii în memorie, pe c'nd
ultima nu va aloca nici o zona de memorie, necesit'nd sa fie ulterior alocată, folosind funcţiile
de alocare dinamică "malloc(), calloc(), realloc()#, prezentate în laboratorul anterior. Un
mic e(emplu de citire a unui şir, caracter cu caracter pana la ):
#include <stdio.h>
#include <string.h>

#define N 30

int main ()
char str[!], c;
int n = 0;

"o
scan#("$c", %c);
i# (c == '0')
break;
&
str[n''] = c;
& (hile(1);

str[n] = ')0';
*rint#("$s", str);

return 0;
&
5
Pentru citirea si afisarea unui şir de caractere se poate folosi flagul *s* la citirea cu scan# sau
afişarea cu*rint#. $easemenea biblioteca st"io+h defineşte funcţiile ,ets() şi *uts() pentru
lucrul cu şiruri de caractere.
 ,ets(-ona) !+ citeşte de la terminalul standard un şir de caractere terminat
cu linie noua "enter#.
 ,uncţia are ca parametru adresa zonei de memorie în care se introduc
caracterele citite.
 ,uncţia returneaza adresa de început a zonei de memorie.
 *uts(-ona) + afişeaza la terminalul standard şirul de caractere din zona data
ca parametru, p'nă la caracterul terminator de şir"-)#, care va fi înlocuit prin
caracterul linie noua.
 ,uncţia are ca parametru adresa zonei de memorie de unde începe
afişarea caracterelor.
 ,uncţia returneaza codul ultimului caracter din şirul de caractere afişat şi
!. daca a aparut o eroare.
,uncţia
,ets()
va citi de la tastatura c'te caractere sunt introduse, ciar daca şirul declarat are
o lungime mai mică. Presupunem un şir declarat:
char a[]=”unsir”
, care va avea deci &
caractere. Citind un şir de lungime mai mare ca & de la tastatura, în şirul a, la afişare vom
vedea ca s!a reţinut tot sirul/"nu doar primele & caractere#. 0imic deosebit p'nă acum. $ar
dacă luăm în considerare că citirea caracterelor au(iliare se face în continuare în zona de
memorie, ne punem problema ce se va suprascrie1/ 2aspunsul este: nu se ştie3 poate nimic
important pentru programul nostru, poate ceva ce il va bloca sau duce la obţinerea de date
eronate.
Pentru a evita aceasta se recomandă utilizarea #,ets().
 #,ets(-ona, lun,.-ona, st"in) !+ citeşte de la st"in un şir de caractere
terminat printr!o linie nouă dacă lungimea lui este mai mică
decat lun,.-ona sau primele lun,.-ona / 1 caractere în caz contrar.
Parametrii sunt: zona de memorie, lungimea ma(ima admisă a şirului, şi
terminalul standard de intrare. 4n cazul în care şirul dorit are lungime mai
mică dec't cea ma(imă, înaintea terminatorului de şir "-)#, în zona de
memorie va fi reţinut şi enter!ul dat"-n#.
6
$#*3*2!)/! !P3*C!4*/*
,uncţii din 5string.6
Pentru manipularea şirurilor de caractere în limba%ul C se folosesc funcţii declarate în fişierul
5string.6. 7om încerca să le detaliem putin pe cele mai des folosite:
strlen()
si-e.t strlen(const char *str);
2eturneaza lungimea unui şir dat ca parametru. "numarul de caractere p'nă la întalnirea
terminatorului de şir:-)#
Exemplu:
#include <stdio.h>
#include <string.h>

#define N 256

int main ()
char te0t[!];
*rint#("1ntro"uceti un te0t2 ");
,ets(te0t);
*rint#("3e0tul are $u caractere+)n", strlen(te0t));
return 0;
&
Iesire:
1ntro"uceti un te0t2 4ust testin,
3e0tul are 15 caractere+
memset()
voi"* memset(voi" **tr, int val, si-e.t num);
4n zona de memorie dată de pointerul ptr, sunt setate primele num poziţii la valoarea dată de
val. ,uncţia returnează şirul ptr.
7
Exemplu:
#include <stdio.h>
#include <string.h>

int main ()
char str[] = "nu *rea vreau vacanta6";
memset(str, '/', 7);
*uts(str);
return 0;
&
Iesire:
/////// vreau vacanta6
memmove()
voi"* memmove(voi" *"estination, const voi" *source, si-e.t num);
Copiază un număr de num caractere de la sursă, la zona de memorie indicată de destinaţie.
Copierea are loc ca şi cum ar e(ista un buffer intermediar, deci sursa si destinatia se pot
suprapune. ,uncţia nu verifică terminatorul de şir la sursă, copiază mereu num b8tes, deci
pentru a evita depăsirea trebuie ca dimensiunea sursei sa fie mai mare ca num. ,uncţia
returnează destinaţia.
Exemplu:
#include <stdio.h>
#include <string.h>

int main ()
char str[] = "memmove can be ver8 use#ul++++++";
memmove(str ' 50, str ' 15, 11);
*uts(str);
return 0;
&
Iesire:
memmove can be ver8 ver8 use#ul+
memcpy()
voi"* memc*8(voi" *"estination, const voi" *source, si-e.t num);
Copiază un număr de num caractere din şirul sursă in şirul destinaţie. ,uncţia returnează şirul
destinaţie.
8
Exemplu:
#include <stdio.h>
#include <string.h>

#define N 40

int main ()
char str1[] = "90em*lu";
char str5[!];
char str:[!];
memc*8(str5, str1, strlen(str1) ' 1);
memc*8(str:, "un sir", 7);
*rint#("str12 $s)nstr52 $s)nstr:2 $s)n", str1, str5, str:);
return 0;
&
Iesire:
str12 90em*lu
str52 90em*lu
str:2 un sir
strcpy()
char* strc*8(char *"estination, const char *source);
Copiază şirul sursă in şirul destinaţie. 9irul destinaţie va fi suprascris. ,uncţia asigură plasarea
terminatorului de şir în şirul destinaţie după copiere. ,uncţia returneaza şirul destinaţie.
strncpy()
char* strnc*8(char *"estination, const char *source, si-e.t num);
:semeni cu strc*8(), dar in loc de a fi copiată toata sursa sunt copiate doar
primele num caractere.
Exemplu:
#include <stdio.h>
#include <string.h>

#define N 40

int main ()
char str1[] = "90em*lu";
char str5[!];
9
char str:[!];
strc*8(str5, str1);
strnc*8(str:, "un sir", 5);
str:[5] = ')0';
*rint#("str12 $s)nstr52 $s)nstr:2 $s)n", str1, str5, str:);
return 0;
&
Iesire:
str12 90em*lu
str52 90em*lu
str:2 un
strcat()
char* strcat(char *"estination, const char *source);
Concatenenaza şirul sursă la şirul destinaţie. ,uncţia returnează şirul destinaţie.
strncat()
char* strncat(char *"estination, const char *source, si-e.t num);
:semeni cu strcat(), dar în loc de a fi concatenată toată sursa sunt concatenate doar
primele numcaractere.
Exemplu:
#include <stdio.h>
#include <string.h>

#define N 80

int main ()
char str[!];
strc*8(str, "ana ");
strcat(str, "are ");
strcat(str, "mere ");
*uts(str);
strncat(str, "si *ere si *rune", 7);
*uts(str);
return 0;
&
Iesire:
10
ana are mere
ana are mere si *ere
strcmp()
int strcm*(const char *str1, const char *str5);
Compară şirul str1 cu şirul str2, verific'ndu!le caracter cu caracter. 7aloarea returnată este )
daca cele şiruri sunt identice, mai mare ca ) daca str. este ;mai mare<"alfabetic# şi mai mic ca
) altfel.
Exemplu:
#include <stdio.h>
#include <string.h>

#define N 80

int main ()
char cuv[] = "rosu";
char cuv.citit[!];
"o
*rint# (";hiceste culoarea+++");
,ets(cuv.citit);
& (hile (strcm*(cuv,cuv.citit) 6= 0);

*uts("<=");

return 0;
&
strchr()
char* strchr(const char *str, int character);
Caută caracterul character în şirul str şi returnează un pointer la prima sa apariţie.
strrchr()
char* strrchr(const char *str, int character);
Caută caracterul character în şirul str şi returnează un pointer la ultima sa apariţie.
strstr()
char* strstr(const char *str1, const char *str5);
Caută şirul str2 în şirul str1 şi returnează un pointer la prima sa apariţie, sau NULL dacă nu a
fost găsit.
11
strdup()
char* str"u*(const char *str);
2ealizează un duplicat al şirului str, pe care îl şi returnează.
Exemplu:
#include <stdio.h>
#include <string.h>

#define N 80

int main ()
char str[!], *";

"o
i# (,ets(str) == 0)
break;
&

" = str"u*(str);
*uts(");
& (hile (1);

return 0;
&
strtok()
char* strto>(char *str, const char *"elimitators);
,uncţia are rolul de a împarţi şirul str în to=ens"subşiruri separate de orice caracter aflat în lista
de delimitatori#, prin apelarea ei succesivă.
>a primul apel, parametrul str trebuie sa fie un şir de caractere, ce urmează a fi împartit.
:pelurile urmatoare, vor avea în loc de str, !?@@ conţinu'nd împarţirea aceluiaşi şir.
,uncţia va returna la fiecare apel un to=en"un subsir#, ignor'nd caracterele cu rol de separator
aflate în şirul de delimitatori. ? dată terminat şirul, funcţia va returna !?@@.
@mplementarea curentă din
Astrin,+hB
nu permite folosirea
strto>()
în paralel pe mai mult
de un şir.
Exemplu:
#include <stdio.h>
#include <string.h>

int main ()
char str[] = "/ ?ite, asta e un sir+";
char **;
12
* = strto>(str, " ,+/");
/* se!r! sirul in "to#eni" si !fise!$!%i e linii se!r!te. */
(hile (* 6= !?@@)
*rint#("$s)n", *); * = strto>(!?@@, " ,+/");
EXEMPLE
1. :roblema &
Scrieti un pro;ram C*C(( care citeste de la tastatura un cu<nt format din cel mult 8# de caractere, doar litere ale
alfabetului en;le%. :ro;ramul determina transformarea cu<ntului citit prin =nlocuirea fiecarei litere mici a cu<ntului cu
litera mare corespun%atoare, restul literelor nemodific<ndu+se, ca =n e>emplu. :ro;ramul afisea%a pe ecran cu<ntul
obtinut. E>emplu6 pentru cu<ntul6 bACAla5rEaT se a afisa pe ecran6 ?ACALA5REAT
@include7strin;.'A
@include7iostream.'A
c'ar s,8&-0
oid main"$
2
cinAAs0
strupr"s$0
cout77s0
3
8. Se considera un te>t cu ma>imum 811 de caractere =n care cuintele sunt separate prin unul sau mai multe spatii.
:rimul caracter din te>tul citit este o litera, iar cuintele sunt formate numai din litere mici ale alfabetului en;le%. Scrieti un
pro;ram C*C(( care citeste de la tastatura te>tul si =l transforma =nlocuind prima litera a fiecarui cu<nt cu litera mare
corespun%atoare, restul caracterelor rBm<n<nd nemodificate. Te>tul astfel transformat a fi afisat pe ecran.
daca de la tastatura se introduce te>tul6 /mare fri; rosu/ se a afisa pe ecran6 /Care !ri; Rosu/
@include7strin;.'A
@include7iostream.'A
c'ars,81D-0
inti0
oidmain"$
2
;ets"s$0
s,#-.toupper"s,#-$0
for"i.#0iAstrlen"s$+&0i(($
if"s,i-..''EEs,i(&-F.''$
s,i(&-.toupper"s,i(&-$0
cout77s0
3
13
BIBLIOGRAFIE
www.wikipedia.!
www."#i$d.!
14
www.ed%#a&i'.!
15