Lista de discussão de MAC 2301


[Prévia por Data][Próxima por Data]
[Prévia por Assunto][Próxima por Assunto]
[Índice por Data][Índice por Assunto]
[Envie uma nova mensagem para a lista] [Responda esta mensagem]

Dica para a leitura de caracteres



Olá Pessoal,
    O texto que segue abaixo foi elaborado pela Rosiani,
monitora da Renata.

Alfredo


Sabemos que uma string é um vetor de caracteres terminada pelo caractere
especial '\0'.

declaração de uma string nome:
char palavra[5];

Esta declaração indica que temos 5 espaços reservados na memoria para
elementos do tipo char. Os índices da string palavra vão de 0 a 4. Supondo
que  a string palavra seja igual a "casa", teremos:
palavra[0] = 'c'
palavra[1] = 'a'
palavra[2] = 's'
palavra[3] = 'a'
palavra[4] = '\0'

Se a string palavra fosse "sol", teriamos:
palavra[0] = 's'
palavra[1] = 'o'
palavra[2] = 'l'
palavra[3] = '\0'
________________________________________________________
É importante que a string termine por '\0', caso contrário algumas funções
não utilizaram corretamente a string. 
Ex.:Teste a execução do código abaixo:
//exemplo1
#include <stdio.h>
void main(){
  char palavra[9];
  int i=-1;
  printf("\nEntre com uma palavra(maximo 8 caracteres) <ENTER>: ");
  do{
    i++,
    palavra[i]=getchar();
  }while (palavra[i] != 10);  // 10 representa o ENTER
  printf("\nA palavra digitada foi %s",palavra);
}

Digite apenas 2 letra + ENTER. Vc verificará q a palavra não será impressa
de forma correta com a função printf(). O q aconteceu? Faltou o '\0' no
final da string.
_________________________________________________________
Agora teste a execução do código abaixo:
//exemplo2
#include <stdio.h>
void main(){
  char palavra[9];
  int i=-1;
  printf("\nEntre com uma palavra(maximo de 8 letras) <ENTER>: ");
  do{
    i++,
    palavra[i]=getchar();
  }while (palavra[i] != 10);  // 10 representa o ENTER
  palavra[i+1] = '\0';
  printf("\nA palavra digitada foi %s",palavra);
}

Tudo certo, não é mesmo? Nem tudo... Ainda  falta verificar se o usuário
não ultrapassou os limites da string palavra (vetor de caracteres). Não
podemos permitir que isto ocorra pelos motivos já explicados no email
sobre limites das matrizes. No exemplo2, informamos apenas ao usuário que
o número de letras permitido é 8. (Por que não seria 9? Lembre-se que
devemos armazenar o caractere '/0' no vetor.) Informamos o número de
letras, mas não impedimos que o limite do vetor seja ultapassado. Então
como fazer?
ATENÇÃO: Ler uma string com scanf() ou gets(), não garante que os limites
da string foram respeitados.
___________________________________________________________
//exemplo3  
#include <stdio.h>
void main(){
  char palavra[9];
  int i=-1;
  printf("\nEntre com uma palavra(maximo 8 caracteres) <ENTER>: ");
  do{
    i++,
    palavra[i]=getchar(); 
  }while ((palavra[i] != 10)&&(i<7));
  palavra[i+1] = '\0';
  printf("\nA palavra digitada foi %s",palavra);
}

Dessa forma, se o usuário entrar com uma palavra com mais de 8 letras,
apenas as 8 primeiras letras formarão a string palavra. A última posição
será ocupada pelo '/0', ou seja, palavra[8] = '/0'.

E o q aconteceu com as outras letras digitadas pelo usuário que "não foram
aproveitadas"? Elas estão guardadas no "buffer" do teclado. Será se isso
causará problemas? Para o exemplo3 não, mas veja o próximo exemplo.
___________________________________________________________
//exemplo4
include <stdio.h>
void main(){
  int numero;
  char palavra[9];
  int i=-1;
  printf("\nEntre com uma palavra(maximo 8 caracteres) <ENTER>: ");
  do{
    i++,
    palavra[i]=getchar();
  }while ((palavra[i] != 10)&&(i<7));
  palavra[i+1] = '\0';
  printf("\nA palavra digitada foi %s",palavra);
  printf("\nEntre com um numero <ENTER>: ");
  scanf("%d",&numero);
  printf("\nO numero digitado foi %d",numero);
}

Entre com uma palavra com mais de 8 letras. O q aconteceu? O q estava no
"buffer do teclado" foi utilizado para atribuir um valor ao numero em
"scanf("%d",&numero)". Como corrigir esse problema? Limpe o buffer do
teclado com a função fflush(stdin). stdin é um ponteiro para o arquivo que
representa a entrada padrão (geralmente o teclado). Esse arquivo é criado
automaticamente quando seu programa é executado.
_______________________________________________________________
Veja:
//exemplo5
include <stdio.h>
void main(){
  int numero;
  char palavra[9];
  int i=-1;
  printf("\nEntre com uma palavra(maximo 8 caracteres) <ENTER>: ");
  do{
    i++,
    palavra[i]=getchar();
  }while ((palavra[i] != 10)&&(i<7));
  palavra[i+1] = '\0';
  printf("\nA palavra digitada foi %s",palavra);
  fflush(stdin);
  printf("\nEntre com um numero <ENTER>: ");
  scanf("%d",&numero);
  printf("\nO numero digitado foi %d",numero);
}

____________________________________________________________

Mas se vc não quiser ler uma string, letra a letra? Exite a função
fgets(). 
Esta função ler uma string de um arquivo. Como queremos ler a partir do
teclado,  podemos usar stdin. Vantagem da função fgets(): Vc pode definir
quantos caracteres fará parte da string.
O protótipo dessa função é:
char *fgets (char *str, int tamanho,FILE *fp);
Sendo que: 
str = ponteiro para um char (nome da string), 
tamanho = número de caracteres, 
fp = ponteiro para arquivo.