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
Codi | Caràcter | Codi | Caràcter | Codi | Codi | Caràcter | Codi |
---|---|---|---|---|---|---|---|
0 | ␀ | 32 | 64 | 96 | ~ | ||
1 | ␁ | 33 | 65 | 97 | |||
2 | ␂ | 34 | 66 | 98 | |||
3 | ␃ | 35 | 67 | 99 | |||
4 | ␄ | 36 | 68 | 100 | |||
5 | ␅ | 37 | 69 | 101 | |||
6 | ␆ | 38 | 70 | 102 | |||
7 | ␇ | 39 | 71 | 103 | |||
8 | ␈ | 40 | 72 | 104 | |||
9 | ␉ | 41 | 73 | 105 | |||
10 | ␊ | 42 | 74 | 106 | |||
11 | ␋ | 43 | 75 | 107 | |||
12 | ␌ | 44 | 76 | 108 | |||
13 | ␍ | 45 | 77 | 109 | |||
14 | ␎ | 46 | 78 | 110 | |||
15 | ␏ | 47 | 79 | 111 | |||
16 | ␐ | 48 | 80 | 112 | |||
17 | ␑ | 49 | 81 | 113 | |||
18 | ␑ | 50 | 82 | 114 | |||
19 | ␓ | 51 | 83 | 115 | |||
20 | ␔ | 52 | 84 | 116 | |||
21 | ␕ | 53 | 85 | 117 | |||
22 | ␖ | 54 | 86 | 118 | |||
23 | ␗ | 55 | 87 | 119 | |||
24 | ␘ | 56 | 88 | 120 | |||
25 | ␙ | 57 | 89 | 121 | |||
26 | ␚ | 58 | 90 | 122 | |||
27 | ␛ | 59 | 91 | 123 | |||
28 | ␜ | 60 | 92 | ~~~~ | 124 | ||
29 | ␝ | 61 | 93 | 125 | |||
30 | ␞ | 62 | 94 | 126 | ~~~~~ | ||
31 | ␟ | 63 | 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
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ó:
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'
:
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'
:
char c = '3';
int v = c - '0';
// v == 3
La operació inversa és anàloga:
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
Lliçons.jutge.org
Jordi Petit, Salvador Roura
© Universitat Politècnica de Catalunya, 2024