Sunteți pe pagina 1din 4

======== Capitolul 5 ======== ================== Procesarea caracterelor ================== --------------------------Tipul de data "char" --------------------------Este unul dintre tipurile fundamentale

din limbajul C. Constantele si variabilele de acest tip sunt folosite pentru reprezentarea caracterelor. Fiecare caracter este memorat pe 1 byte (octet), care (in general) este compus din 8 biti. n octet compus din 8 biti poate pastra !"8#!$% valori distincte. Cand memoram un caracter intr&un octet, continutul acestuia poate fi gandit ca un caracter sau un intreg mic (intre ' si !$$). (esi putem memora !$% valori distincte, doar o parte din ele sunt tiparibile (litere mici, mari, cifre, semne de punctuatie, spatiu, tab, caractere speciale ), *, +). E,emple de caractere netiparibile- ne.line, bell. / constanta caracter se scrie intre apostroafe, cum ar fi- 0a0, 0b0. / declaratie obisnuita a unei variabile de tip caracter estec1ar c2 3ariabilele caracter se pot initializa astfelc1ar c1 # 040, c! # 0*02 n caracter este pastrat in memorie pe un octet dupa o codificare specifica. 5ulte masini folosesc codurile de caractere 46C77 sau E8C(7C. 9e vom referi numai la codul 46C77. 4stfel, vom preciza constanta caracter si valoarea corespunzatoare a sade la !"$)!": pana la $;, in ordine- 0'0, 010, ..., 0<0 de la !"%)!"' pana la <', in ordine- 040, 080, ..., 0=0 de la !"%)!"$)!"' pana la 11!, in ordine- 0a0, 0b0, ..., 0z0 a (e e,emplu, se observa ca pentru a obtine litere mici din cele mari, sc1imbam doar un bit. 4stfel, caracterul 040 are codul %$ care inseamna numarul '1'''''1 in baza !, iar caracterul 0a0 are codul '11''''1. 6e observa ca difera doar bitul cu numarul >. &&&&&&&&&&& E,emple&&&&&&&&&&& 7n functiile ?printf()? si ?scanf()?, pentru formatul caracter se foloseste +c. printf(?+c?, 0a0)2 va tipari a printf(?+c+c+c?, 040, 080, 0C0)2 va tipari 48C printf(?+d?, 0a0)2 va tipari <; printf(?+c?, <;)2 va tipari a 4numite caractere netiparibile necesita ?secvente escape? (@ reprezinta caracterul escape). 7n acest sens, dam un tabel 9umele caracterului alert bacAslas1 bacAspace carriage return g1ilimea formfeed tab orizontal ne.line caracterul nul apostrof tab vertical 5odul de scriere @a @@ @b @r @? @f @t @n @' @0 @v 3aloarea intreaga ; <! 8 1> >: 1! < 1' ' >< 11

&&&&&&&&&&& E,emple- Ce va fi afisat in cazul urmatoarelor instructiuni B &&&&&&&&&&& 1. printf(?@?48C@??)2

!.

printf(?048C0?)2

n alt mod de a scrie o constanta caracter este folosind una, doua sau trei cifre octale ca secvente escape, cum ar fi 0@'';0. 4cest 0@'';0 este de fapt caracterul ?alert? (sau clopotel). El mai poate fi scris 0@';0 sau 0@;0 sau @a. --------------------------------------------------Utilizarea lui "getchar()" si "putchar()" --------------------------------------------------4ceste functii sunt folosite pentru citirea si scrierea caracterelor si sunt definite in Cstdio.1D. 4stfel pentru citirea unui caracter de la tastatura se foloseste ?getc1ar()?, iar pentru scrierea unui caracter pe ecran ?putc1ar()?. 8ineinteles ca daca dorim sa afisam un sir de caractere mai mare, este mai elegant cu functia ?printf()?. &&&&&&&&&&& E,emplu&&&&&&&&&&& rmatorul program citeste un caracter din intrare (tastatura) si il atribuie unei varibile de tip c1ar, apoi il afiseaza pe ecran. Einclude Cstdio.1D main() F c1ar c2 .1ile (1) F c#getc1ar()2 putc1ar(c)2 G G 6ingurul mod de a opri acest program este sa apasam CHIJ"C. Kutem reface acest program folosind constanta E/F. Einclude Cstdio.1D main() F int c2 .1ile ((c # getc1ar()) L# E/F) F putc1ar(c)2 G G &&&&&&&&&&&&&& Comentarii&&&&&&&&&&&&&& 1. 7n biblioteca Cstdio.1D, e,ista o linie in care se declara Edefine E/F (&1) (enumirea lui E/F provine de la ?end&of&file?. !. 3ariabila c trebuie sa fie declarata de tip int si nu de tip c1ar. 4m vazut ca sfarsitul unui fisier este codificat cu &1, si nu cu un caracter. >. 6ube,presia c#getc1ar() citeste o valoare de la tastatura si o asigneaza variabilei c. -------------------------Biblioteca <ctype.h -------------------------6istemul C pune la dispozitie fisierul 1eader Cctype.1D care contine o multime de macro&uri (definitii) folosite pentru testarea caracterelor si o multime de prototipuri de functii ce sunt folosite pentru conversia caracterelor.

7n tabelul de mai jos prezentam o lista de macro&uri folosite la testarea caracterelor. 4ceste macro&uri iau ca argument o variabila de tip int si returneaza o valoare de tip int (zero#false, diferit de zero#true). &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& M 5acro M 6e returneaza true (diferit de zero) daca &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& isalp1a(c) c este litera isupper(c) c este litera majuscula islo.er(c) c este litera mica isdigit(c) c este cifra isalnum(c) c este litera sau cifra is,digit(c) c este cifra 1e,azecimala isspace(c) c este caracter spatiu ispunct(c) c este semn de punctuatie isprint(c) c este caracter tiparibil isgrap1(c) c este tiparibil, dar diferit de spatiu iscntrl(c) c este caracter de control isascii(c) c este cod 46C77 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& M

7n tabelul urmator, vom scrie functiile ?toupper()? si ?tolo.er()?, care sunt din biblioteca standard si macro&ul ?toascii()?. 5acro&ul si prototipurile pentru cele doua functii sunt in Cctype.1D. 4cestea au ca argument o variabila de tip int si returneaza tipul int. toupper(c) tolo.er(c) toascii(c) sc1imba c din litera mica in majuscula sc1imba c din majuscula in litera mica sc1imba c cu codul 46C77

&&&&&&&&&&&&&&&& n e,emplu util- 9umararea cuvintelor &&&&&&&&&&&&&&&& 3rem sa numaram cate cuvinte sunt introduse de la tastatura. Ele sunt separate prin spatiu. Kentru scrierea programului vom utiliza tot strategia ?top&do.n?. Einclude Cstdio.1D Einclude Cctype.1D main() F int numarNcuvinte # '2 int gasesteNurmatorulNcuvant(void)2 .1ile (gasesteNurmatorulNcuvant() ## 1) )) numarNcuvinte2 printf(?9umarul de cuvinte # +d@n@n?, numarNcuvinte)2 G int gasesteNurmatorulNcuvant(void) F int c2 .1ile (isspace(c # getc1ar())) 2 O* sarim peste spatii *O if (c L# E/F) F .1ile ((c # getc1ar()) L# E/F PP Lisspace(c)) 2 O* sarim peste orice diferit de E/F si spatii *O if (c L# E/F) return 12 else return '2 G return '2 G ----------------------------------------------!"ercitii propuse spre i#ple#e$tare ----------------------------------------------1. Folosind functiile ?getc1ar()? si ?putc1ar()?, sa se scrie un program C care transforma literele mici in litere mari. 7ncercati si o varianta de program care foloseste functiile ?islo.er()? si ?toupper()?.

!. tilizand functiile ?getc1ar()? si ?putc1ar()? creati un program C care sa copie un fisier in alt fisier (comanda voastra proprie de copiere). tilizati redirectarea L (e asemeni, precizati si cazul cand dorim sa copiem un fisier la sfarsitul unui fisier e,istent. >. 6crieti in C un analizor le,ical care sa recunoasca cat mai multi atomi le,icali din C. (e e,emplu, cuvintele rezervate (.1ile, do, for, ...), identificatori, operatori (relationali, logici, artimetici, ...) si eventual alte structuri. 4poi, tipariti acelasi fisier de intrare cu e,ceptia spatiilor multiple si a comentariilor. :. 6crieti un program C care citeste caractere de la tastatura si le scrie la ecran. 6crieti toate vocalele cu litere majuscule si consoanele cu litere mici. 4poi, scrieti un program C care citeste caractere de la tastatura si sterge vocalele din ele (afisand doar consoanele). (4cest mod de scriere era folosit in scrisul 1ieroglific al Qreciei 4ntice). $. (?Kretty printing?) 6crieti un program C care are la intrare un fisier sursa C si il transforma intr&un program C scris frumos (eventual in stilul 8ell Jaboratoires).

S-ar putea să vă placă și