Caracteres
Caracteres são representados pelo tipo char
, que também representa o menor tipo inteiro.
Isso acontece pois caracteres são representados por códigos númericos, que indicam diferentes caracteres.
A implementação mais comum e adotada é o padrão ASCII, que estabelece um padrão para caracteres utilizando os código númericos de 0 a 127 para representar 128 caracteres diferentes.
Abaixo uma imagem representando a tabela ASCII:
Exemplo de código utilizando caracteres :
#include <stdio.h>
int main() {
char test = 'A';
putchar(test); //Escreve o caractere 'A'
}
Sequências de escape
Podemos escrever caracteres utilizando sequências de escape que começam com \
.
Sendo elas:
\a
: Alerta, geralmente toca um beep quando escrito (Bell 0x7)\b
: Backspace, usado para apagar uma tecla (0x8)\f
: Usado para quebra de página, mantendo a mesma posição horizontal mas em uma nova linha (Form Feed 0xC)\n
: Escreve uma nova linha (LF ou line feed 0xA)\r
: Volta o cursor para o início da linha (CR ou Carriage Return 0xD), além disso o padrão de nova linha do windows é\r\n
\t
: Equivalente ao "tab", insere espaços para formatação (0x9)\v
: Tab vertical (0xB)\'
: Usado para digitar o caractere'
pois ele é normalmente usado para literais de caractere\"
: Usado para digitar o caractere"
pois ele é normalmente usado para literais de string\\
: Usado para digitar o caractere\
pois ele é usado para sequências de escape\OOO
: Usado para digitar um caractere em uma string, indicando uma sequência no sistema númerico octal,OOO
deve ser números de0
a8
\xHH
: Usado para digitar um caractere ASCII, diretamente no seu valor em hexadecimal,HH
deve ser 2 digitos hexadecimais.\xHHHH
: Usado para digitar um caractere Unicode, diretamente no seu valor em hexadecimal,HHHH
deve ser 4 digitos hexadecimais.
Tipos adicionais de caracteres
Existem outros tipos adicionais de caracteres, sendo eles :
wchar_t
: Tipo de caractere "largo" definido pela plataforma, no geral é utilizado para caracteres em UTF-16 no windows e UTF-32 no linux/macOs.char8_t
: Utilizado para guardar caracteres em UTF-8 e é o mesmo tipo efetivo deunsigned char
(adicionado noC23
).char16_t
: Utilizado para guardar caracteres que ocupam até 16bits (adicionado noC11
).char32_t
: Utilizado para guardar caracteres que ocupam até 32bits (adicionado noC11
).
Estes tipos ajudam também a especificar a intenção do código, pois seria possível usar tipos de inteiros para guardar os códigos de caracteres que são maiores ou mesmo usar unsigned char
diretamente para caracteres UTF-8.
Já o tipo wchar_t
é especialmente útil no Windows, que internamente usa UTF-16 e exige em muitos casos, uso de strings neste padrão, como wchar_t
foi incluido antes mesmo do C11
, é possível usar versões mais antigas do C com ele.
Literais de caractere
Para escrever caracteres, podemos utilizar :
'A' //Literal de caractere
L'B' //Literal de caractere do tipo wchar_t
u'C' //Literal de caractere do tipo char16_t (adicionado no C11)
U'💻' //Literal de caractere do tipo char32_t (adicionado no C11)
u8'D' //Literal de caractere em UTF-8 (adicionado no C23)
Também é possível escrever literais para múltiplos caracteres, mas o valor efetivo é definido pela implementação.
- Literais de múltiplos caracteres como
'AB'
tem tipoint
. - Literais largos de múltiplos caracteres como
L'AB'
tem tipowchar_t
. - Os especificadores
u
eU
geralmente não devem ser usados para literais de múltiplos caracteres, pois não são suportados em compiladores como clang e seu suporte foi totalmente removido noC23
.
Apesar de literais de múltiplos caracteres serem definidos por implementação, a maioria dos compiladores, exceto o MSVC (compilador da microsoft), implementa como um valor em big endian alinhado para direita, de forma que \1
seja 0x00000001
e \1\2\3\4
seja 0x01020304
.
Literais de múltiplos caracteres são comumente utilizados para definir números "mágicos" usados no início de arquivos para identificar unicamente seu tipo, por exemplo imagens em PNG começam com %PNG
, Zips com PK
, BMPs com BMP
.