Ir ao conteúdo
  • Cadastre-se

C Scanf aceitando letras como números. Como resolver?


Ir à solução Resolvido por bearminator,

Posts recomendados

Fiz um código para uma agenda de clientes, em linguagem C. A variável para as opções do menu (cadastrar, listar, encerrar), coloquei como inteira. Para leitura da opção digitada, utilizei o scanf, com o %d. No entanto, além de números, o scanf também está aceitando letras! Como faço para o scanf aceitar apenas números inteiros? Ou, qual outra forma que posso fazer isso? Sou novata em programação. Se alguém puder me ajudar, eu agradeço. Segue um trecho do meu código.

agenda.txt

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução

Uma opção seria você trocar o tipo de dado de op para char e, assim, ler um caractere em vez de um inteiro. O usuário continuará digitando um "número", mas eles serão tratados como caracteres.

char op;

//outros códigos

scanf("%c", &op);

//outros códigos

Daí, você também que teria de trocar os valores dos rótulos case: para os caracteres correspondentes.

case '0':

//...

case '1':

//..

case '2':

E também na instrução while()

do{

//...

}while(op != '0');

 

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Com este especificador ("%d") a função acessa um inteiro lendo decimais. 

O restante é dos caracteres deve ignora, exceto [+ ou -] inicialmente. 

 

Se uma entrada é composta e se os primeiros caracteres corresponderem ao especificador, a função acessa até que a reciprocidade acabe.

 

 P. ex.1: 

ENTRADA: +12numero

Ler somente +12, e 'numero\n' será ignorado permanecendo na memória para outras leituras.

 

 P. ex.2: 

ENTRADA: numero

'numero\n' será ignorado e permanece (no buffer) para outras leituras porque o especificador é de dígitos decimais.

 

 

33 minutos atrás, Verônica Xavier Gabardo disse:

No entanto, além de números, o scanf também está aceitando letras!

Não deveria; no caso se digitar caracteres não decimais ela ignora.

 

De um exemplo  acontece ?

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@Verônica Xavier Gabardo    você poderia usar uma string para pegar o que o usuário digitar , e depois conferir se foi digitado números ou letras ou outro caractere , usando para isso o comando isdigit , que retorna true se o caractere for um dígito de zero até nove , senão retorna false , e se foi digitado algum outro caractere então retorne a fazer a leitura novamente ,  e assim que fizer a checagem e estiver tudo certo então use o comando atoi para converter a string para inteiro e use no switch normalmente , e seu código poderia ser assim  :

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<locale.h>
struct   agenda      {
	char nome    [40],
	     telefone[20],
	     email   [30];
};
int main(){
    setlocale(LC_ALL,"Portuguese");
    struct agenda dados [5];
    int i, op, cont = 0;
    char string[20];
    do{
        system("cls"                                   );
        printf("AGENDA DE CLIENTES\n\n"                );
        printf("Digite 1 para cadastrar novo cliente\n");
        printf("Digite 2 para visualizar clientes\n"   );
        printf("Digite 0 para encerrar  "              );
        leitura:
        fflush(stdin);
        scanf ("%s", string);
        for( i=0; i<strlen(string); i++         ){ // verificar os caracteres da string
            if( ! isdigit(string[i]))goto leitura;
            // se algum caractere da string não fo um digito
            // decimal de 0 a 9 volta ao inicio
        }
        op = atoi( string                                               );
        switch( op                                                      ){
        case 0:
            system("cls"                                                );
            printf("Aplicação encerrada!\n"                             );
            break                                                        ;
        case 1:
            system ("cls"                                               );
            if( cont <= 5                                               ){
                printf("CADASTRAR CLIENTE\n\n"                          );
                printf("Código ------------: %d\n", cont+1              );
                printf("Digite o nome -----: "                          );
                fflush(stdin                                            );
                fgets (dados[cont].nome, 40, stdin                      );
                dados[cont].nome[strlen(dados[cont].nome)-1]='\0'        ;
                fflush (stdin                                           );
                printf("Digite o telefone -:"                           );
                fgets (dados[cont].telefone, 20, stdin                  );
                dados[cont].telefone[strlen(dados[cont].telefone)-1]='\0';
                fflush(stdin                                            );
                printf("Digite o e-mail ---:"                           );
                fgets (dados[cont].email, 30, stdin                     );
                dados[cont].email[strlen(dados[cont].email)-1]='\0'      ;
                fflush(stdin                                            );
                printf("\n"                                             );
                cont++                                                   ;
            }
            else{
                printf("Agenda lotada!\n"                               );
                system ("pause"                                         );
            }
            break;
        case 2:
            system ("cls"                                               );
            if( cont == 0                                               ){
                printf ("Agenda vazia!\n"                               );
            }
            else{
                printf ("LISTA DE CLIENTES\n\n"                         );
                for( i=0; i<cont; i++                                   ){
                    printf ("Código ----: %d\n"  , i+1                  );
                    printf ("Nome ------: %s\n"  , dados[i].nome        );
                    printf ("Telefone --: %s\n"  , dados[i].telefone    );
                    printf ("E-mail ----: %s\n\n", dados[i].email       );
                }
            }
            system ("pause"                                             );
            break                                                        ;
        default:
            system ("cls"                                               );
            printf ("Erro: opção inválida!\n"                           );
            system ("pause"                                             );
        }
        }while( op != 0                                                 );
        return 32768                                                     ;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!