Duvida em C

1. Duvida em C

william jussim
jussim

(usa Ubuntu)

Enviado em 30/09/2018 - 19:31h

Boa tarde pessoal,
Estou com a seguinte duvida. Fiz um projeto para a faculdade e estou fazendo o tratamento de excessões agora. Quando o scanf recebe um argumento invalido o programa entra em um loop infinito (e.g: Quando é digitado uma letra em um campo que deveria ser inteiro). Pesquisei sobre como corrigir isso e achei somente indicações para armazenar como caracter e depois fazer o cast para inteiro. Mas se eu fosse fazer isso para toda a entrada de inteiro ou double que utilizo iria ter de fazer muitas conversões desse tipo (dezenas delas) e não acho que o código ficaria "Limpo". Sem falar que teria de praticamente refazer o código para alterar os tipos e fazer as conversões.

Minha dúvida é a seguinte, existe uma forma mais fácil de fazer essa limitação? Ou pelo menos imperdir que o sistema entre em loop? Caso ele receba uma entrada inesperada exibir uma msgm de erro ou algo do tipo? Agradeço a atenção de todos.


  


2. Re: Duvida em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/10/2018 - 04:49h

A função scanf() devolve um valor de retorno, indicando quantas conversões com atribuição de valor foram bem sucedidas. Você tem de testar esse valor retornado pela função, a fim de saber se o(s) valor(es) atribuído(s) à(s) variável(is) e(são) válido(s) ou não.

Veja o exemplo abaixo:

int n, r;
while(1) {
printf("Digite um valor inteiro: ");
r=scanf("%d", &n);
if(r==EOF){
/* Erro de leitura ou EOF durante tentativa de leitura. Sai do programa. */
exit(1);
}
if(r==1){
/*
Sai do laço de repetição quando r==1, que indica leitura bem sucedida (i.e., como você
pediu uma conversão, e o número de conversões bem sucedidas é igual a 1).
*/
break;
}
/* Caso contrário, esvazia o buffer de entrada e tenta novamente. */
clearerr(stdin);
do
r=getchar();
while(r!='\n' && r!=EOF);
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts