[RESOLVIDO]Linguagem C: impedir o usuário de guardar um caracter em uma variável int !?

9 respostas
D

Eu conheço a função isdigit e outras derivadas do ctype.h, mas elas não funcionam em meu programa ! Alguém ai descobriu uma lógica eficaz que impede isso ?
De um exemplo em código por favor.

9 Respostas

R

Na verdade quando o usuário digita um caractere o C entende como int pelo código ASC do caractere

#include <stdio.h>
int main ()
{
    char letra;
    int codigo_letra;
    printf("Digite uma letra: ");
    codigo_letra = getchar();  // letra c

    letra = codigo_letra;
    printf("Letra: %c \nCódigo da letra: %d", letra, codigo_letra);  // Letra: c - código: 99
}
#include <stdio.h>
int main ()
{
    int codigo_letra;
    printf("Digite uma letra: ");
    scanf("%d", &codigo_letra); // 99

    printf("Letra: %c - Código Letra: %d", codigo_letra, codigo_letra); // Letra: c - Código: 99
}
A

Você pode fazer outra coisa. Você lê o número como uma cadeia de caracteres (char), ignorando letras, ao ler. Depois basta fazer o cast para uma variável inteira. Para ignorar letras, na leitura, faça isso:

/* ignora tudo de a à z */ scanf("%[^a-z]s",&variavel);

D

#Andre Rosa
Tentei fazer da forma como disse.

char Cpessoas;
int pessoas
printf("Digite o numero de pessoas:  ");
scanf("%[^a-z]s",&Cpessoas); // Quando se digita um numero aqui nada acontece
pessoas = (int) Cpessoas;

#renamed
eu estou usando o compilador dev c ++, quando o usuário guarda um caracter em um int, o programa da erro e fecha.

Vou mandar parte de meu código para voces darem uma olhada:

int pessoas;

  printf("Digite a quantidade de pessoas:  ");
  scanf("%i", &pessoas);
  // daqui em diante, é coletado cpf, idade, nome, outros, então todas as matrizes que crio é com o tamanho pessoas. Acho que e por isso que o programa da erro.
R

Acho que sempre dará erro porque, em qualquer caso, o usuário pode digitar sasdasdads, que não é um inteiro e fará o programa voar quando o programa tentar colocar a string no inteiro.

Se realmente for necessária fazer essa validação, leia a idade como vetor de char e verique se cada posicao no vetor está entre 0 e 9, assim:

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

int numero_valido(char num_str[]);

int main ()
{
    // números de no máximo 10 dígitos
    char num_str[10];
    // onde guardaremos o número caso ele seja válido
    int numero;

    printf("Digite o número: ");
    gets(num_str);

    if (!numero_valido(num_str))
    {
        puts("Número não é válido");
        puts(num_str);
    }
    else
    {
        numero = atoi(num_str);
        printf("O número %d é válido \n", numero);
    }

}

int numero_valido(char num_str[])
{
    for(int i = 0; i < strlen(num_str); i++)
    {
        if (!(num_str[i] >= '0' && num_str[i] <= '9'))
        {
            return 0;
        }
    }
    return 1;
}
R

.

D

vlw renamd, acho que seu código dará certo. vou testar e amanhã volto aqui pra dizer se deu certo! flww

G

diegointersoft:
Eu conheço a função isdigit e outras derivadas do ctype.h, mas elas não funcionam em meu programa ! Alguém ai descobriu uma lógica eficaz que impede isso ?
De um exemplo em código por favor.

Boa noite diegointersoft,

Eu não sei se entendi muito bem a sua necessidade, mas isso aqui não lhe ajuda?

http://www.cplusplus.com/reference/clibrary/cctype/isalpha/

Espero que sim.

[]'s

D

O algoritmo do RENAMED resolveu meu problema, só fiz uns ajustes nele:

int FNumComp(char string[])  
{  
    for (int i = 0; i < strlen(string); i++){  
        if ( (string[i] >= '0' && string[i] <= '9') == 0)  
            return 0; // Numero nao é valido 
    }  
  return 1; // Numero é valido  
}  

float FNumArm () { 
    float num=0;
    char string[10];

    do{
       gets(string);  
       if (FNumComp(string) == 0)  
           printf("Numero nao e valido\n%s\n\n", string);    
       else
           num = atoi(string); 
    }while(num == 0);  
  return num;
}

Obrigado a todos ! :wink:

G

diegointersoft:
O algoritmo do RENAMED resolveu meu problema, só fiz uns ajustes nele:

int FNumComp(char string[])  
{  
    for (int i = 0; i < strlen(string); i++){  
        if ( (string[i] >= '0' && string[i] <= '9') == 0)  
            return 0; // Numero nao é valido 
    }  
  return 1; // Numero é valido  
}  

float FNumArm () { 
    float num=0;
    char string[10];

    do{
       gets(string);  
       if (FNumComp(string) == 0)  
           printf("Numero nao e valido\n%s\n\n", string);    
       else
           num = atoi(string); 
    }while(num == 0);  
  return num;
}

Obrigado a todos ! :wink:

Maravilha velhinho, ^^

Soh edita o assunto do seu primeiro post e acrescenta a tag [RESOLVIDO] nele.

[]'s

Criado 13 de novembro de 2011
Ultima resposta 14 de nov. de 2011
Respostas 9
Participantes 4