CURSO DE C
Os caracteres são um tipo de dado: o char. O C trata os caracteres como sendo
variáveis de um byte (8 bits). Um bit é a menor unidade de
armazenamento de informações em um computador. Os inteiros (ints) têm um número
maior de bytes. Dependendo da implementação do compilador, eles podem ter 2 bytes
(16 bits) ou 4 bytes (32 bits). Isto será melhor explicado na aula 3. Na linguagem C,
também podemos usar um char para armazenar valores numéricos inteiros, além de
usá-lo para armazenar caracteres de texto. Para indicar um caractere de texto usamos
apóstrofes. Veja um exemplo de programa que usa caracteres:
#include <stdio.h> int main () { char Ch; Ch='D'; printf ("%c",Ch); return(0); }
No programa acima, %c indica que printf() deve colocar um caractere na tela. Como vimos anteriormente, um char também é usado para armazenar um número inteiro. Este número é conhecido como o código ASCII correspondente ao caractere. Veja o programa abaixo:
#include <stdio.h>
int main ()
{
char Ch;
Ch='D';
printf ("%d",Ch); /* Imprime o caracter como inteiro */
return(0);
}
Este programa vai imprimir o número 68 na tela, que é o código ASCII correspondente ao caractere 'D' (d maiúsculo).
Muitas vezes queremos ler um caractere fornecido pelo usuário. Para isto as funções
mais usadas, quando se está trabalhando em ambiente DOS ou Windows, são getch() e
getche(). Ambas retornam o caractere pressionado. getche() imprime o
caractere na tela antes de retorná-lo e getch() apenas retorna o caractere
pressionado sem imprimí-lo na tela. Ambas as funções podem ser encontradas no arquivo
de cabeçalho conio.h. Geralmente estas funções não estão disponíveis em
ambiente Unix (compiladores cc e gcc) e podem ser substituídas pela função scanf(), porém sem as mesmas funcionalidades. Eis um exemplo que
usa a função getch(), e seu correspondente em ambiente Unix:
#include <stdio.h> #include <conio.h> int main () { char Ch; Ch=getch(); printf ("Voce pressionou a tecla %c",Ch); return(0); }
Equivalente para o ambiente Unix do programa acima, sem usar getch():
#include <stdio.h> int main () { char Ch; scanf("%c", &Ch); printf ("Voce pressionou a tecla %c",Ch); return(0); }
A principal diferença da versão que utiliza getch() para a versão que não utiliza getch() é que no primeiro caso o usuário simplesmente aperta a tecla e o sistema lê diretamente a tecla pressionada. No segundo caso, é necessário apertar também a tecla <ENTER>.
No C uma string é um vetor de caracteres terminado com um caractere nulo. O caracter nulo é um caractere com valor inteiro igual a zero (código ASCII igual a 0). O terminador nulo também pode ser escrito usando a convenção de barra invertida do C como sendo '\0'. Embora o assunto vetores seja discutido posteriormente, veremos aqui os fundamentos necessários para que possamos utilizar as strings. Para declarar uma string podemos usar o seguinte formato geral:
char nome_da_string[tamanho];
Isto declara um vetor de caracteres (uma string) com número de posições igual a tamanho. Note que, como temos que reservar um caractere para ser o terminador nulo, temos que declarar o comprimento da string como sendo, no mínimo, um caractere maior que a maior string que pretendemos armazenar. Vamos supor que declaremos uma string de 7 posições e coloquemos a palavra João nela. Teremos:
J | o | a | o | \0 | ... | ... |
No caso acima, as duas células não usadas têm valores indeterminados. Isto acontece porque o C não inicializa variáveis, cabendo ao programador esta tarefa. Se quisermos ler uma string fornecida pelo usuário podemos usar a função gets(). Um exemplo do uso desta função é apresentado abaixo. A função gets() coloca o terminador nulo na string, quando você aperta a tecla "Enter".
#include <stdio.h>
int main ()
{
char string[100];
printf ("Digite uma string: ");
gets (string);
printf ("\n\nVoce digitou %s",string);
return(0);
}
Neste programa, o tamanho máximo da string que você pode entrar é uma string de 99 caracteres. Se você entrar com uma string de comprimento maior, o programa irá aceitar, mas os resultados podem ser desastrosos. Veremos porque posteriormente.
Como as strings são vetores de caracteres, para se acessar um determinado caracter de uma string, basta "indexarmos", ou seja, usarmos um índice para acessarmos o caracter desejado dentro da string. Suponha uma string chamada str. Podemos acessar a segunda letra de str da seguinte forma:
str[1] = 'a';
Por quê se está acessando a segunda letra e não a primeira? Na linguagem C, o índice começa em zero. Assim, a primeira letra da string sempre estará na posição 0. A segunda letra sempre estará na posição 1 e assim sucessivamente. Segue um exemplo que imprimirá a segunda letra da string "Joao", apresentada acima. Em seguida, ele mudará esta letra e apresentará a string no final.
#include <stdio.h>
int main()
{
char str[10] = "Joao";
printf("\n\nString: %s", str);
printf("\nSegunda letra: %c", str[1]);
str[1] = 'U';
printf("\nAgora a segunda letra eh: %c", str[1]);
printf("\n\nString resultante: %s", str);
return(0);
}
Nesta string, o terminador nulo está na posição 4. Das posições 0 a 4, sabemos que temos caracteres válidos, e portanto podemos escrevê-los. Note a forma como inicializamos a string str com os caracteres 'J' 'o' 'a' 'o' e '\0' simplesmente declarando char str[10] = "Joao". Veremos, posteriormente que "Joao" (uma cadeia de caracteres entre aspas) é o que chamamos de string constante, isto é, uma cadeia de caracteres que está pré-carregada com valores que não podem ser modificados. Já a string str é uma string variável, pois podemos modificar o que nela está armazenado, como de fato fizemos.
No programa acima, %s indica que printf() deve colocar uma string na tela. Vamos agora fazer uma abordagem inicial às duas funções que já temos usado para fazer a entrada e saída.
A função printf() tem a seguinte forma geral:
printf (string_de_controle,lista_de_argumentos);
Teremos, na string de controle, uma descrição de tudo que a função vai colocar na tela. A string de controle mostra não apenas os caracteres que devem ser colocados na tela, mas também quais as variáveis e suas respectivas posições. Isto é feito usando-se os códigos de controle, que usam a notação %. Na string de controle indicamos quais, de qual tipo e em que posição estão as variáveis a serem apresentadas. É muito importante que, para cada código de controle, tenhamos um argumento na lista de argumentos. Apresentamos agora alguns dos códigos %:
Código | Significado |
%d | Inteiro |
%f | Float |
%c | Caractere |
%s | String |
%% | Coloca na tela um % |
Vamos ver alguns exemplos de printf() e o que eles exibem:
printf ("Teste %% %%") -> "Teste % %" printf ("%f",40.345) -> "40.345" printf ("Um caractere %c e um inteiro %d",'D',120) -> "Um caractere D e um inteiro 120" printf ("%s e um exemplo","Este") -> "Este e um exemplo" printf ("%s%d%%","Juros de ",10) -> "Juros de 10%"
Maiores detalhes sobre a função printf() (incluindo outros códigos de
controle) serão vistos posteriormente, mas podem ser consultados
de antemão pelos interessados.
O formato geral da função scanf() é:
scanf (string-de-controle,lista-de-argumentos);
Usando a função scanf() podemos pedir dados ao usuário. Um exemplo de uso, pode ser visto acima. Mais uma vez, devemos ficar atentos a fim de colocar o mesmo número de argumentos que o de códigos de controle na string de controle. Outra coisa importante é lembrarmos de colocar o & antes das variáveis da lista de argumentos. É impossível justificar isto agora, mas veremos depois a razão para este procedimento. Maiores detalhes sobre a função scanf() serão vistos posteriormente, mas podem ser consultados de antemão pelos interessados.
AUTO AVALIAÇÃO
Veja como você está:
a) Escreva um programa que leia um caracter digitado pelo usuário, imprima o caracter digitado e o código ASCII correspondente a este caracter.
b) Escreva um programa que leia duas strings e as coloque na tela. Imprima também a segunda letra de cada string.
Curso de C do CPDEE/UFMG - 1996 - 1999