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.
char representa um caractere em um espaço de 1 byte'A'(aspas simples)printf("%c", c) para exibir / scanf("%c", &c) para ler%c duas vezes: a primeira descarta a quebra de linhac + ('a'-'A')ch - '0'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)
'A'%c(c de character)'A'(aspas simples) e "A"(aspas duplas) são coisas diferentes'A' — aspas simpleschar c = 'A';"A" — aspas duplas\0)char s[] = "A";
"A" : uma sequência de valores char seguida de \0 como terminador.'A' , estamos interpretando o número 65 como um caractere .char c = 'A'; e char c = 65; armazenam o mesmo valor.printf("%c", 65) → A; printf("%d", 'A') → 65.'A' + 1 corresponde a 'B'.| Caractere | Decimal | Hexadecimal | Descrição |
|---|---|---|---|
| \0 | 0 | 0x00 | Caractere nulo (marca o fim da string) |
| \t | 9 | 0x09 | Tabulação horizontal |
| \n | 10 | 0x0A | Quebra de linha |
| ␣ | 32 | 0x20 | Espaço |
| Caractere | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| Decimal | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
| Caractere | A | B | C | D | E | F | G | H | I | J | K | L | M |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Decimal | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 |
| Caractere | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
| Decimal | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 |
| Caractere | a | b | c | d | e | f | g | h | i | j | k | l | m |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Decimal | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 |
| Caractere | n | o | p | q | r | s | t | u | v | w | x | y | z |
| Decimal | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 |
'a' - 'A' = 32 vale para as letras ASCII. Essa diferença permite converter entre maiúsculas e minúsculas.
#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; }
char c = 'A'; char lower = c + ('a' - 'A'); // 'A' + 32 = 'a' // Ou: char lower = c + 32;
char ch = '7'; // Vale 55 (ASCII de '7') int n = ch - '0'; // 55 - 48 = 7 (o inteiro 7) printf("%d\n", n); // → 7
if (c >= 'A' && c <= 'Z') // É maiúscula? if (c >= '0' && c <= '9') // É dígito? // <ctype.h> também oferece isupper(c) e isdigit(c)
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.'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 .'A' tem tipo int. Em char c = 'A';, esse valor é armazenado em uma variável char de 1 byte.scanfprintf é 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 */
%c(um caractere)&c, da mesma forma que em scanf("%d", &n) para um int.c .&.scanf , a leitura pode receber a quebra de linhaint 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);
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.5 Enter, o buffer fica assim:scanf("%d", &n) retira apenas 5 e o armazena em n. A quebra de linha \n permanece no buffer:scanf("%c", &c) lê o primeiro caractere do buffer. Como esse caractere é \n…A, c já recebeu a quebra de linha \n.%c em duas leituras: a primeira descarta a quebra de linha; a segunda lê o caractere desejado.%c duas vezes%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!
%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.
%c" %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'
dummy supõe que sobrou exatamente uma quebra de linha; se você digitar espaços extras antes de “5 Enter”, a leitura sai desalinhada.Confira o que você aprendeu nesta aula!
char c = 'A'; , qual é a saída de printf("%d", c) ?char armazena um inteiro (código ASCII). 'A' vale 65, então %d exibe 65; %c exibe A.
'A'(aspas simples) e "A"(aspas duplas): qual é a diferença?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.
scanf("%d", &n) , como ler corretamente um caractere?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.