Você está na página 1de 6

Notas de Aula - Introducao a Computacao `

Departamento de Cincia da Computacao IME-USP e

Caracteres - Tipo char


Ronaldo F. Hashimoto e Carlos H. Morimoto

Introducao
At agora vimos como o computador pode ser utilizado para processar informacao que pode ser quanticada e de forma numrica. No entanto, h muita informacao que no numrica, como por exemplo o seu nome, seu e a a e e endereco residencial, uma fotograa sua ou o som de sua voz. Textos so compostos por caracteres do alfabeto, a de pontuacao, acentuacao, etc. Para que possam ser processados pelo computador, precisamos de uma forma para representar caracteres utilizando apenas n meros. u Ao nal dessa aula voc dever saber: e a Declarar, ler e imprimir variveis do tipo char. a Descrever como caracteres so representados no computador e porque eles podem ser utilizados em exa o presses. Utilizar variveis do tipo char em programas. a

Caracteres
Um caractere pode ser uma letra (mai scula ou min scula), um ponto nal, ponto de interrogacao, colchetes, u u enm, s mbolos que normalmente encontramos num teclado de um computador. Nesta aula, estudaremos as variveis utilizadas em C para armazenar caracteres. a Em C, caracteres so armazenados como n meros inteiros, normalmente utilizando uma tabela de converso a u a amplamente difundida chamada Tabela ASCII (American Standard Code for Information Interchange). o A Tabela ASCII original possui somente 128 caracteres, aqueles com cdigo entre 0 e 127. Veja na tabela abaixo, a correspondncia entre caractere e n mero (entre os n meros 32 e 127). e u u 032 040 048 056 064 072 080 088 096 104 112 120 ! ) 1 9 A I Q Y a i q y 033 041 049 057 065 073 081 089 097 105 113 121 " * 2 : B J R Z b j r z 034 042 050 058 066 074 082 090 098 106 114 122 # + 3 ; C K S [ c k s { 035 043 051 059 067 075 083 091 099 107 115 123 $ , 4 < D L T \ d l t | 036 044 052 060 068 076 084 092 100 108 116 124 % 5 = E M U ] e m u } 037 045 053 061 069 077 085 093 101 109 117 125 & . 6 > F N V ^ f n v ~ 038 046 054 062 070 078 086 094 102 110 118 126 / 7 ? G O W _ g o w 039 047 055 063 071 079 087 095 103 111 119 127

( 0 8 @ H P X h p x

Existem vrias extenses da tabela ASCII utilizando tambm os n meros negativos de 1 a 128. Normalmente, a o e u estas tabelas estendidas incluem os caracteres acentuados. u u A cada caractere corresponde a um n mero entre 0 e 127 e a cada n mero entre 0 e 127 corresponde a um caractere. Caractere com cdigo 32 corresponde ao espaco em branco e o caractere com cdigo 127 varia de o o computador a computador.

Os caracteres com cdigo decimal entre 0 e 31 so chamados de caracteres de controle, ou seja, eles indicam o a alguma coisa ao que a impressora ou monitor de v deo devem executar. Entre eles, os mais utilizados so: a Caractere nulo backspace line feed carriage return Cdigo ASCII o 0 8 10 13 Signicado este caractere simplemente ignorado pela impressora ou v e deo. volta um caractere pula uma linha o cursor vai para a primeira coluna.

Assim, quando voc digita a letra A (ou o backspace) no teclado, na verdade, o seu computador armazena na e memria o n mero inteiro 65 (ou o n mero 8, respectivamente), ou seja, para armazenar a letra A, o computador o u u armazena o n mero 65. u

Decorar a Tabela ASCII?


Para evitar a necessidade de decorar a tabela ASCII, na linguagem C, escrever um caractere entre apstrofes o equivale a escrever o seu cdigo ASCII. Assim, escrever 65 e A so equivalentes. Conseq entemente, os o a u comandos i = 65 e i = A so equivalentes, assim como x = x + 65 e x = x + A. Dessa forma, observe o a e a e o e comando A = A. Neste caso, A uma varivel e A o caractere cujo cdigo ASCII 65; neste comando, o n mero 65 armazenado na varivel A. u e a Os caracteres so ordenados de acordo com seu cdigo ASCII. Assim o caractere 0 (zero) menor que o a o e caractere 1 (um) pois o cdigo ASCII do caractere zero (48) menor que o cdigo ASCII do caractere um (49). o e o Assim, 0 < 1, pois 48 < 49. Da mesma forma, 1 < 2 < 9 < ... < A < B < ... < Z < ... < a < b < ... < z, pois 49 < 50 < ... < 65 < 66 < ... < 90 < ... < 97 < 98 < ... < 122.

Varivel Tipo Char a


Uma varivel inteira de 32 bits (4 bytes) pode armazenar n meros inteiros no intervalo de 2.147.483.648 a a u +2.147.483.647. No compilador gcc, este tipo de varivel declarado como int. Assim, nestes compiladores, a a e declaracao int x declara uma varivel inteira x que armazena inteiros com 4 bytes, ou seja, a varivel inteira x a a pode armazenar inteiros compreendidos entre 2.147.483.648 a +2.147.483.647. a e u Para armazenar um caractere, poder-se-ia utilizar uma varivel inteira (uma vez que um caractere um n mero inteiro). No entanto, observe que estar amos utilizando mais memria (bytes) do que precisar o amos, uma vez que para qualquer caractere, o seu respectivo cdigo ASCII inteiro entre 128 a +127. Uma varivel inteira o e a de 8 bits (1 byte) pode armazenar n meros inteiros compreendidos entre 128 a +127, exatamente o que u amos para armazenar o cdigo ASCII de um caractere. Este tipo de varivel declarado como char. o a e precisar A forma para declarar uma varivel do tipo char a mesma para declarar variveis do tipo int; s que em vez a e a o de usar a palavra chave int, deve-se usar a palavra char:
char <nome_da_variavel>;

Exemplo: declaracao de uma varivel do tipo char de nome "ch" a


char ch;

Se voc quiser declarar vrias variveis, poss fazer da seguinte forma: e a a e vel

char <nome_da_variavel_1>, <nome_da_variavel_2>, <nome_da_variavel_3>,. . ., <nome_da_variavel_n>;

Exemplo: declaracao de duas variveis do tipo char "ch1" e "ch2". a


char ch1, ch2;

Leitura de um Caractere pelo Teclado


Como vimos nas aulas passadas, para ler um n mero inteiro pelo teclado, ns usamos o %d dentro do comando u o scanf. Assim, para ler um inteiro x fazemos:
1 2 3 4

int x ; printf ( " Entre com um numero x > 0: " ) ; scanf ( " % d " , &x ) ;

e Para ler um caractere pelo teclado, voc deve utilizar %c dentro do comando scanf. Aqui temos duas observacoes. A primeira o espaco em branco antes do %c. A segunda que, no Linux, a tecla <ENTER> e e corresponde ao caractere de cdigo ASCII 10; no Windows, a tecla <ENTER> deve gerar uma seq ncia de dois o ue caracteres: um cujo cdigo ASCII 13 e outro de cdigo ASCII 10. Para o exemplo, vamos considerar que o e o estamos trabalhando no Linux. e Antes de comentar o truque do espaco em branco antes do %c, vamos dar uma idia do que acontece na leitura de um caractere pelo teclado. O comando scanf ("%c", &ch) ca esperando o usurio digitar uma tecla a e em seguida um <ENTER>, o programa converte a tecla digitada para o n mero correspondente ao cdigo ASCII u o e este n mero armazenado na varivel inteira de 1 byte de nome ch. u e a Para mostrar o porque do espaco em branco antes do %c dentro do scanf, considere o seguinte trecho de e programa que l dois caracteres usando dois comandos scanf:
1 2 3 4 5 6 7

char a , b ; printf ( " Entre com um caractere : " ) ; scanf ( " % c " , &a ) ; printf ( " Entre com um outro caractere : " ) ; scanf ( " % c " , &b ) ;

Note que neste particular exemplo, no foi utilizado espaco em branco antes do %c dentro de cada scanf. a Neste trecho de programa, para ler o primeiro caractere, o usurio dever digitar um caractere do teclado (por a a exemplo, a letra A) e posteriormente dar um <ENTER>. Como o <ENTER> tambm um caractere (um caractere e e cujo cdigo ASCII 10), ele ser lido no segundo scanf (que contm a varivel b). Assim, a varivel a ir conter o e a e a a a o n mero 65 e a varivel b o n mero 10. Bem, provavelmente, a intencao do programador deste trecho no era u a u a ler o <ENTER> na varivel b. a Para evitar que o seu programa confunda o <ENTER> como caractere a ser lido, colocado um espaco em branco e antes do %c dentro de cada scanf. Assim, o trecho de programa corrigido ca:
1 2 3 4 5 6 7

char a , b ; printf ( " Entre com um caractere : " ) ; scanf ( " % c " , &a ) ; printf ( " Entre com um outro caractere : " ) ; scanf ( " % c " , &b ) ;

S que esta maneira de enganar traz consigo um pequeno problema. Alm de no ler o caractere <ENTER>, o o e a ` seu programa no vai ser capaz de ler o caractere espaco em branco e o caractere correspondente a tabulacao. a Mas isso pode no ser incoveniente, uma vez que em muitos problemas de computacao envolvendo caracteres, a os caracteres de tabulacao e espaco em branco devem ser mesmo ignorados.

Impresso de Caracteres a
Como vimos nas aulas passadas, para imprimir um n mero inteiro na tela, ns usamos o %d dentro do comando u o printf. Assim, para imprimir um inteiro x fazemos:
1 2 3 4 5 6

int x ; printf ( " Entre com um numero x > 0: " ) ; scanf ( " % d " , &x ) ; printf ( " N mero lido foi = % d \ n " , x ) ; u

Para imprimir um caractere na tela, ns devemos usar o %c dentro do comando printf. Note que agora no o a temos mais o espaco em branco antes do %c dentro do printf. Assim, considere o seguinte trecho de programa que l dois caracteres ignorando espacos em branco, <ENTER> e tabulacoes: e
1 2 3 4 5 6 7 8 9

char a , b ; printf ( " Entre com um caractere : " ) ; scanf ( " % c " , &a ) ; printf ( " Primeiro Caractere Digitado : % c \ n " , a ) ; printf ( " Entre com um outro caractere : " ) ; scanf ( " % c " , &b ) ; printf ( " Segundo Caractere Digitado : % c \ n " , b ) ;

Eventualmente, poder amos estar interessados em imprimir o cdigo ASCII do caractere em vez do prprio o o caractere. Neste caso, basta colocar %d no lugar do %c. Assim, o seguinte trecho de programa escreve tambm o e o cdigo ASCII do caractere digitado:
1 2 3 4 5 6 7 8 9

char a , b ; printf ( " Entre com um caractere : " ) ; scanf ( " % c " , &a ) ; printf ( " Primeiro Caractere Digitado : % c ( Codigo ASCII = % d )\ n " , a , a ) ; printf ( " Entre com um outro caractere : " ) ; scanf ( " % c " , &b ) ; printf ( " Segundo Caractere Digitado : % c ( Codigo ASCII = % d )\ n " , b , b ) ;

Exemplos de Exerccio Envolvendo Caracteres


Exemplo 1
Faca um programa em C que imprima todos os caracteres cujo cdigos ASCII esto entre 32 e 126. o a Solucao:

1 2 3 4 5 6 7 8 9 10

#include <stdio . h> i n t main ( ) { char c ; f o r ( c = 32; c < 127; c++) printf ( " caractere % c com ASCII % d \ n " , c , c ) ; return 0 ; }

Observe que, como o tipo char na verdade armazena um n mero correspondente ao cdigo ASCII do caractere, u o esse n mero pode ser impresso como um n mero inteiro. No printf dentro do for, a varivel c utilizada tanto u u a e como inteiro (usando %d na impresso), como caractere (usando %c para impresso). a a Voc pode utilizar variveis do tipo char dentro de expresses numricas como se fossem variveis inteiras, e a o e a porm, lembre-se de que, como uma varivel char utiliza apenas um byte, os valores que ela pode representar e a variam de -128 a +127. a e vel. No entanto, h um desperd de memria, pois uma varivel a cio o a Uma solucao usando varivel inteira poss inteira ocupa 4 bytes; enquanto que uma varivel do tipo char ocupa 1 byte: a
1 2 3 4 5 6 7 8 9 10

#include <stdio . h> i n t main ( ) { int c ; f o r ( c = 32; c < 127; c++) printf ( " caractere % c com ASCII % d \ n " , c , c ) ; return 0 ; }

Exemplo 2
Escreva um programa que leia um caractere min sculo e transforme-o em mai sculo. u u Solucao: para escrever esse programa, no precisamos utilizar a tabela ASCII diretamente, apenas precisamos saber como a ela foi denida. e gitos de 0 a 9 ocupam posicoes na tabela antes das letras De uma forma geral, bom saber que os d mai sculas A a Z, que por sua vez ocupam posicoes na tabela antes das letras min sculas de a a z. u u Assim, como vimos anteriormente, poss e vel comparar dois caracteres, de forma que a seguinte relacao e vlida: 0 < 1 < ... < 9 < A < B < ... < Z < a < ... < z. a Agora, se voc observar a tabela, os cdigos ASCII dos caracteres A e a so 65 e 97, respectivamente. Assim, e o a a diferenca entre A e a 32. O mesmo acontece com os caracteres B e b e assim por diante. Dessa forma, e u u o u para converter um caractere min sculo para mai culo, basta subtrair o cdigo ASCII do caractere min sculo de 32 para se obter o cdigo ASCII do caractere mai sculo. Assim: o u
1 2 3 4 5 6 7

char ch ; ch = a ; ch = ch 32; printf ( " Caractere Maiusculo = % c " , ch ) ;

Na linha 3, a varivel ch recebe o cdigo ASCII do caractere a min sculo, ou seja, o n mero 97. Na linha 5, a o u u o valor de ch subtra de 32 cando com o valor 65. Na linha 7, o caractere cujo ASCII 65 impresso, ou e do e e seja, o caractere A. e a o u u Agora, e se voc no soubesse que a diferenca entre os cdigos ASCII entre mai sculas e min sculas fosse 32. E se um dia construirem uma tabela diferente em que esta diferenca mudasse? O que a gente poderia fazer a e seguinte conta:
1 2 3

char dif ; dif = a A ;

A varivel dif guarda o resultado da diferenca entre os cdigos ASCII dos caracteres a e A. a o Assim, uma solucao para o nosso exerc de converso de min scula para mai scula pode ser: cio a u u
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

#include <stdio . h> i n t main ( ) { char letra , dif ; printf ( " Digite uma letra : " ) ; scanf ( " % c " , &letra ) ; dif = ( a A ) ; i f ( letra >= a && letra <= z ) { / sabemos que eh uma l e t r a m i n u s c u l a / letra = letra dif ; printf ( " Maiuscula : % c \ n " , letra ) ; } else printf ( " % c nao e uma letra minuscula \ n " , letra ) ; return 0 ; }

Exerccios recomendados
1. Dada uma sequncia de caracteres terminada por um ponto ., representando um texto, determinar a e frequncia relativa de vogais no texto (por exemplo, no texto Em terra de cego quem tem um olho e e caolho, essa frequncia 16/42). e e 2. Dada uma frase terminada por ., imprimir o comprimento da palavra mais longa. 3. Dada uma seq ncia de caracteres terminada por ., determinar quantas letras min sculas e mai sculas ue u u aparecem na seqncia. ue 4. Dada uma frase terminada por ., determinar quantas letras e quantas palavras aparecem no texto. Por exemplo, no texto O voo GOL547 saiu com 10 passageiros. h 25 letras e 7 palavras. a

Você também pode gostar