Skip to content

Caràcters

Aquesta lliçó explica els valors que poden prendre les variables de tipus caràcter (char), com es representen, i quines són les operacions que se'ls pot aplicar.

El tipus char

En informàtica, un caràcter és una unitat d'informació que es correspon a un símbol. Una lletra (majúscula o minúscula), un espai en blanc, un dígit o un signe de puntuació són exemples de caràcters.

En C++ s'utilitza el tipus char per emmagatzemar i tractar caràcters.

Representació

En C++, la majoria de caràcters s'escriuen entre cometes simples. Per exemple, 'j' representa una jota minúscula, 'J' una jota majúscula, '.' un punt, '3' un símbol amb forma de tres (el qual no té res a veure amb l'enter 3), i ' ' un espai en blanc (que si convé ressaltar, a vegades nosaltres l'escriurem '⎵' en aquestes lliçons).

A més, alguns caràcters especials es representen a través de codis darrera d'una barra invertida. Per exemple, per representar una cometa simple, cal usar '\''. També, per representar la barra invertida cal usar '\\'.

SRF: Jo esborraria això: Els caràcters de control també es representen així: '\n' representa un salt de línia (␊) i '\b' representa el so de la campaneta (␇).

Internament, els caràcters es codifiquen amb nombres. Una taula de caràcters defineix a quin nombre es correspon cada caràcter. La majoria d'ordinadors usen la taula de caràcters ASCII[W], la qual descriu 128 caràcters:

CodiCaràcterCodiCaràcterCodiCodiCaràcterCodi
03264@96~
133!65A97a
234"66B98b
335#67C99c
436$68D100d
537%69E101e
638&70F102f
739'71G103g
840(72H104h
941)73I105i
1042*74J106j
1143+75K107k
1244,76L108l
1345-77M109m
1446.78N110n
1547/79O111o
1648080P112p
1749181Q113q
1850282R114r
1951383S115s
2052484T116t
2153585U117u
2254686V118v
2355787W119w
2456888X120x
2557989Y121y
2658:90Z122z
2759;91[123{
2860<92~~~~124
2961=93]125}
3062>94^126~~~~~
3163?95_127

És molt important no aprendre's mai aquesta taula! Només cal observar-ne unes poques característiques fonamentals:

  • Els caràcters de la primera columna (amb codis inferiors a 32) i el 127 són codis de control, és a dir, produeixen efectes especials quan s'escriuen. Per exemple, el caràcter ␇ (amb codi 7) s'anomena bell i serveix per fer sonar una campaneta. Els utilitzareu rarament o mai.

SRF: no posaria lo del line feed. Encada l'usaria algu en lloc del endl. Això: el caràcter ␊ (amb codi 10) s'anomena line feed i serveix per passar de línia.

  • Alguns caràcters s'agrupen naturalment en famílies de codis consecutius: els caràcters de la 'a' a la 'z' són les lletres minúscules, els caràcters de la 'A' a la 'Z' són les lletres majúscules, i els caràcters del '0' al '9' són els dígits.

  • Els caràcters que representen dígits no tenen com a codi el seu valor. Per exemple, el codi del dígit '3' no és 3, sinó 51. Que sigui 51 no és gens important. Però, com veurem ben aviat, que sigui 3 unitats més gran que el codi del '0', que és 48, sí.

Operacions

Les operacions que es poden aplicar entre caràcters són, de fet, les mateixes que entre enters. La diferència és que són enters més petits i sempre positius (entre 0 i 255).

Per exemple, per saber si un caràcter c és o no una lletra majúscula es podria fer

c++
char c = ...;
bool es_majuscula = c >= 'A' and c <= 'Z';

que correspon a mirar si el codi de c es troba entre el codi de la 'A' i el codi de la 'Z', aprofitant que entre elles hi ha totes les majúscules i cap altre caràcter.

Similarment, si es vol saber si c és una lletra (majúscula o minúscula) es pot fer amb aquesta condició:

c++
bool es_lletra = (c >= 'A' and c <= 'Z') or (c >= 'a' and c <= 'z');

Només les operacions de suma i resta són útils amb els caràcters. Per exemple, si volem convertir una lletra minúscula en la majúscula corresponent (per exemple, de 'd' a 'D'), el que es pot fer és restar-li el codi de la 'a' i sumar-li el de la 'A':

c++
char c = 'd';
c = c - 'a' + 'A';
// c == 'D'

Amb els dígits les coses són similars. Per exemple, es pot obtenir l'enter 3 a partir del dígit '3' simplement restant-li el codi del '0':

c++
char c = '3';
int v = c - '0';
// v == 3

La operació inversa és anàloga:

c++
int v = 3;
char c = v + '0';
// c == '3'

Observació important: Fixeu-vos que hem estat capaços d'escriure tots aquests fragments de programes sobre caràcters sense referenciar mai explícitament els codis de la taula ASCII. Fer-ho seria de loosers!

La llibreria <cctype>

El mòdul cctype de la llibreria estàndard de C++ ofereix una sèrie de funcions sobre caràcters.

Caràcters en Unicode

Com segurament ja haureu observat, la taula ASCII només defineix caràcters americans. No hi ha lletres accentuades (com ara à o Å), ces trencades (com ara Ç), enyes (com ara Ñ), ni caràcters d'alfabets més o menys exòtics (com ara δ, س‎ o )... Per posar-hi remei, actualment s'ha estandaritzat l'ús del Unicode [W], que permet l'escriptura en totes les llengües conegudes i amb símbols especials com ara els matemàtics. Nosaltres no utilitzarem Unicode perquè no ens aportaria res a aquest curs.

Lliçons.jutge.org
Jordi Petit, Salvador Roura
© Universitat Politècnica de Catalunya, 2024

lliçons.jutge.org