Ajuda com o scanf na linguagem C.

Iniciado por williamjuan, 26 de Agosto de 2013, 17:39

tópico anterior - próximo tópico

williamjuan

Oi pessoal. Minha dúvida é simples. O scanf da linguagem C lê uma variável, certo? Mas e se o usuário entrar com uma variável diferente daquela que foi declarada. Vou mostrar um exemplo:

int x;

scanf ("%i", &x);

Daí o sujeito digitou a letra A, mas eu não queria isso. Eu queria que ele de fato entrasse com um inteiro, e retornar uma mensagem de erro caso ele não digitasse um inteiro.

Outro caso que me causa dúvidas é o exemplo abaixo:

char x[10];

scanf ("%s", &x);

Daí o cara entrou com uma string de 20 caracteres. E aí? Vai dar pau. Como eu posso resolver isso?

Sergio Benjamim

#1
É proibido no fórum dar up viu.

Dá uma procurada no scanf na net, quando ele lê uma variável e há sucesso, ele retorna um inteiro equivalente ao número de sucessos. Daí daria para fazer uma validação de dados, como se segue:


/*
* File:   teste.c
* Author: Sergio Benjamim
*
* Created on 27 août 2013, 00:23
*/

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
   // Declaracao de variaveis
   int x, valid;

   // Leitura e validacao de dados
   printf("Digite um numero: ");
   do {
       valid = scanf(" %d", &x);
       //printf("\nValor do scanf: %d", valid); // Usado para testar o programa e entender o que o scanf retorna
       if (valid == 0) {
           printf("\nNao eh um numero, digite o valor novamente: ");
           while(getchar() != '\n'); // Usado para o programa nao entrar em loop infinito, ele limpa o buffer de entrada do teclado, experimente retirar
       }
   } while (valid == 0);

   // Mostrando na tela o valor digitado
   printf("\nValor digitado: %d", x);
   
   printf("\n\nAperte Enter para sair.");
   getchar(); getchar(); // Para pausar o programa, lembre-se que o system("pause") nao funciona no Linux

   return (EXIT_SUCCESS);
}
É novo no Ubuntu? Já leu o Ubuntu – Guia do Iniciante 2.0 ?
Experimente o Xubuntu 14.04 !

irtigor

Desse jeito ainda aceitaria, por exemplo, "5sss", como ele para de ler a entrada, ao encontrar a primeira falha, você deve ter "5" em "x". Mas é essa a ideia, o scanf retorna o numero de itens da entrada que correspondem ao padrão e foram atribuídos com sucesso. Quanto a segunda pergunta, o scanf não checa o limite do buffer, então pode ocorrer buffer overflow, pra evitar - ainda usando o scanf - delimite, tipo %10s.

irtigor

Entrou, mas não fez a alteração pedida. Trancado. Releia as regras do fórum: http://ubuntuforum-br.org/index.php/topic,43147.0.html