Aula 22: Caracteres (tipo char)

Fundamentos de char em C: diferenças entre 'A' e "A", códigos ASCII, representação inteira, entrada com scanf e cuidados com a quebra de linha.

🎬
Assista à aula em vídeo (em japonês, cerca de 5 minutos)
Slides com narração em japonês
📖 O que aprender nesta página
✅ Fundamentos essenciais
  • char representa um caractere em um espaço de 1 byte
  • Escreva um caractere como 'A'(aspas simples)
  • printf("%c", c) para exibir / scanf("%c", &c) para ler
  • Na sequência de entradas, use %c duas vezes: a primeira descarta a quebra de linha
  • char armazena um inteiro (código ASCII)
⭐ Para aprofundar
  • Conversão entre maiúsculas e minúsculas c + ('a'-'A')
  • De dígito a inteiro: ch - '0'
  • Um caractere japonês não cabe em um único char

Conheça char: um espaço para um caractere

Você já usou int (inteiros) e double (números reais). Agora vamos conhecer char, o tipo para caracteres. O nome vem de character. Uma variável desse tipo ocupa 1 byte e armazena um caractere ASCII. A sintaxe é simples:
char c = 'A';          // Armazena o caractere A em c
printf("%c\n", c);    // → A   (exibe A na tela)

🎨 Visualização: char é uma caixa com uma posição

char c =
'A'
1 byte
→
printf("%c", c)
Saída na tela
→
A
Tela

⚠️ 'A'(aspas simples) e "A"(aspas duplas) são coisas diferentes

Mesmo usando a letra A,o tipo e o significado mudam conforme as aspas. Entenda essa diferença desde o início.
🔵 'A' — aspas simples
A
um caractere
(o valor cabe em um char de 1 byte)
char c = 'A';
🟠 "A" — aspas duplas
A
\0
string(array de char / terminado em \0)
char s[] = "A";
Na próxima aula, umastringserá como "A" : uma sequência de valores char seguida de \0 como terminador.

💡 char guarda um número: um pouco mais de detalhe

Os fundamentos estão acima. A seguir, vamos explicar por que podemos calcular com char .
Na verdade, char armazena um inteiro de 1 byte; quando a tela mostra 'A' , estamos interpretando o número 65 como um caractere .
Vale lembrar:
• Em ASCII, char c = 'A'; e char c = 65; armazenam o mesmo valor.
• printf("%c", 65) → A; printf("%d", 'A') → 65.
• Por isso, 'A' + 1 corresponde a 'B'.

Tabela rápida de códigos ASCII

Cada caractere tem um número. Os três grupos principais são: dígitos (0–9)•maiúsculas (A–Z)•minúsculas (a–z) .

① Caracteres de controle e espaço mais usados

CaractereDecimalHexadecimalDescrição
\000x00Caractere nulo (marca o fim da string)
\t90x09Tabulação horizontal
\n100x0AQuebra de linha
␣320x20Espaço

② Dígitos (10 caracteres)

Caractere0123456789
Decimal48495051525354555657

③ Letras maiúsculas (26 caracteres)

CaractereABCDEFGHIJKLM
Decimal65666768697071727374757677
CaractereNOPQRSTUVWXYZ
Decimal78798081828384858687888990

④ Letras minúsculas (26 caracteres)

Caractereabcdefghijklm
Decimal979899100101102103104105106107108109
Caracterenopqrstuvwxyz
Decimal110111112113114115116117118119120121122
👀 Observe: A maiúsculo vale 65; a minúsculo vale 97.'a' - 'A' = 32 vale para as letras ASCII. Essa diferença permite converter entre maiúsculas e minúsculas.

Exemplo: entre caracteres e números

#include <stdio.h>

int main(void) {
    char c = 'A';
    printf("c = %c\n", c);     // → A   (exibe como caractere)
    printf("c = %d\n", c);     // → 65  (exibe como inteiro)

    // Também podemos calcular com caracteres
    printf("%c\n", c + 1);    // → B   (65+1=66, o código de 'B')
    printf("%c\n", 'Z' - 3);  // → W

    // Armazenar 65 em char equivale a armazenar 'A'
    char d = 65;
    printf("%c\n", d);        // → A
    return 0;
}

Técnicas comuns

① Converter maiúscula em minúscula
char c = 'A';
char lower = c + ('a' - 'A');   // 'A' + 32 = 'a'
// Ou: char lower = c + 32;
② Converter um dígito em um inteiro
char ch = '7';            // Vale 55 (ASCII de '7')
int n = ch - '0';        // 55 - 48 = 7 (o inteiro 7)
printf("%d\n", n);       // → 7
③ Verificar se é maiúscula ou dígito
if (c >= 'A' && c <= 'Z') // É maiúscula?
if (c >= '0' && c <= '9') // É dígito?
// <ctype.h> também oferece isupper(c) e isdigit(c)

Por que char é um inteiro?

Na década de 1960, ASCII (American Standard Code for Information Interchange) definiu uma tabela de letras, dígitos e símbolos como números de 7 bits. C trata caracteres como inteiros. Essa representação simples facilita operações com caracteres e é uma característica importante da linguagem.
Atenção: um caractere japonês não cabe em um char
char c = 'あ'; pode gerar erro ou aviso.Um caractere japonês exige vários bytes(por exemplo, 3 bytes em UTF-8 para あ). Use um array dechar, o tipowchar_t ou trate a codificação explicitamente. Os exemplos com um único char desta aula usam caracteres ASCII: letras, dígitos e símbolos.
💡 Lembrete: o computador só representa números
Como vimos na aula 1, o computador trabalha com 0 e 1 (sinais elétricos ligados ou desligados).
Mesmo quando você vê 'A' ou 'あ' na tela, a memória armazena tudo como valores numéricos . char ser um inteiro não é uma exceção:simplesmente atribuímos um número a cada caractere .
Com essa ideia, será mais fácil compreender strings, arquivos, comunicação e imagens como sequências de bytes, isto é, números.
Em C, a constante de caractere 'A' tem tipo int. Em char c = 'A';, esse valor é armazenado em uma variável char de 1 byte.

Leia char com scanf

Agora que você conhece char, vamos aprender a ler um caractere do teclado . A ideia é simples, mas existeuma armadilha com a quebra de linha em entradas consecutivas , que veremos em seguida.

Uso básico

printf é complementado por scanf. O formato é %c(c de character). Assim como com %d para int, precisamosusar o endereço da variável & na chamada .
#include <stdio.h>

int main(void) {
    char c;
    printf("Digite um caractere: ");
    scanf("%c", &c);          // ← Não se esqueça do &!
    printf("Caractere lido: %c\n", c);
    return 0;
}
/* Exemplo: Digite um caractere: A (digite A e pressione Enter). Saída: Caractere lido: A */
Para lembrar: use printf("%c", c) para exibir e scanf("%c", &c) para ler. Na leitura, passe o endereço da variável com &.

⚠️ Atenção: após outro scanf , a leitura pode receber a quebra de linha

Existe uma armadilha quando vocêchama scanf duas ou mais vezes seguidas . Por exemplo, ao ler um número e depois um caractere…
int  n;
char c;
scanf("%d", &n);  // Digite um número e pressione Enter
scanf("%c", &c);  // Queremos ler um caractere, mas o resultado não é o esperado!
printf("n=%d c=[%c]\n", n, c);
Mesmo se você pretende digitar 5, Enter, A, Enter, c recebe '\n' (a quebra de linha), em vez de 'A'. Isso acontece porque a entrada passa pelo buffer de entrada, uma espécie de sala de espera invisível.

🔍 O que acontece no buffer de entrada

Quando você digita5 Enter, o buffer fica assim:
5
Dígito
\n
Quebra de linha inserida por Enter
① scanf("%d", &n) retira apenas 5 e o armazena em n. A quebra de linha \n permanece no buffer:
5
→ n=5
\n
Ainda está aqui!
② Em seguida, scanf("%c", &c) lê o primeiro caractere do buffer. Como esse caractere é \n…
\n
Início do buffer
→
c = '\n'
Resultado inesperado!
→ Antes de você digitar A, c já recebeu a quebra de linha \n.
③ A solução usa %c em duas leituras: a primeira descarta a quebra de linha; a segunda lê o caractere desejado.
\n
Descartar na primeira leitura
→
A
Ler na segunda leitura

✅ Solução: usar %c duas vezes

Logo após ler o número, uma quebra de linha pode continuar no buffer. Usamos %c em duas chamadas: a primeira lê a quebra de linha em dummy para descartá-la, e a segunda recebe o caractere desejado.
int  n;
char dummy;
char c;
scanf("%d", &n);
scanf("%c", &dummy); // Descarta o '\n' restante
scanf("%c", &c);     // Lê o próximo caractere digitado
printf("n=%d c=[%c]\n", n, c); // → n=5 c=[A], como esperado!
Para lembrar: A primeira leitura de %c serve para descartar; a segunda leitura de %c recebe o caractere desejado..
%d lê o número e pode deixar a quebra de linha de Enter no buffer.%c também lê essa quebra de linha como um caractere, exigindo esse cuidado na sequência de entradas.

✅ Solução mais prática — colocar um espaço antes do %c

Um espaço na string de formato significa “pular todos os espaços, tabulações e quebras de linha”. Escrevendo " %c", a quebra de linha restante é pulada antes de ler o caractere, então não é preciso o dummy. Em programas reais, esta forma é a mais usada.
scanf("%d", &n);
scanf(" %c", &c);    // o espaço antes de %c pula o '\n'
* Não serve quando você quer ler o próprio espaço como caractere. Além disso, o método do dummy supõe que sobrou exatamente uma quebra de linha; se você digitar espaços extras antes de “5 Enter”, a leitura sai desalinhada.

Aulas relacionadas

Introdução
Aula 3: Variáveis
Fundamentos de variáveis e tipos como int, double e char: espaços para armazenar valores.
Laços, arrays e strings
Aula 23: Strings
Sequências de char terminadas por \0. Inclui strlen e strcpy.
Introdução
Aula 4: printf e scanf
Como usar printf e scanf em C, com uma tabela de especificadores de formato.
Exercícios desta aulaStrings: 13 exercíciosEscreva código no navegador e receba a correção automática. Com dicas e soluções →
← Aula anterior
Aula 21: Quiz (Vetores)
Próxima aula →
Aula 23: Strings

Quiz de revisão

Confira o que você aprendeu nesta aula!

Q1. char c = 'A'; , qual é a saída de printf("%d", c) ?

A
65
Erro

char armazena um inteiro (código ASCII). 'A' vale 65, então %d exibe 65; %c exibe A.

Q2. 'A'(aspas simples) e "A"(aspas duplas): qual é a diferença?

Ambos representam exatamente o mesmo caractere
"A" é uma string terminada em \0 (2 bytes)
'A' também tem um \0 no final

Em C, a constante de caractere 'A' tem tipo int. Em char c = 'A';, a variável c ocupa 1 byte. Já "A" é um array de char com 'A' e '\0', ocupando 2 bytes.

Q3. Após scanf("%d", &n) , como ler corretamente um caractere?

scanf("%c", &c)
scanf("%c", &dummy); scanf("%c", &c)
scanf("c", &c)

O primeiro %c descarta a quebra de linha em dummy; o segundo %c lê o caractere desejado. Não está entre as alternativas, mas escrever scanf(" %c", &c) (com um espaço antes do %c) também pula a quebra de linha.

Compartilhe este artigo
Compartilhar no X (Twitter) Compartilhar no Facebook Enviar pelo LINE Hatena Bookmark