Ir ao conteúdo
  • Cadastre-se

C Verificar se valor de entrada é um dígito hexadecimal


Lim4
Ir à solução Resolvido por kgin,

Posts recomendados

A ideia é definir um macro que retorne se o valor passado como parâmetro é um dígito hexadecimal, ou seja, faça parte destas sequências (1-9, A-F, a-f). O código não tá completo, mas já tá nítido o que eu pensei em fazer (incluir todos os possíveis dígitos e ir comparando). Como posso melhorar este programa?

 

#include <stdio.h>
#define IS_DIGIT(x) ((x == '1' || x == '2' || x == 'A' || x == 'B' || x == 'a' || x == 'b') ? "True" : "False")

int main() {

    char digit;
    printf("Insert the digit: ");
    scanf("%c", &digit);

    printf("Is a hexa digit? %s\n", IS_DIGIT(digit));

    return 0;
}

 

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

  • Solução

@Lim4 Eu acho que uma melhoria seria usar uma função, e também não ficar comparando um por um.

Exemplo

#include <stdio.h>
#include <ctype.h>

int
is_digit(char digito)
{
    return((digito >= '0' && digito <= '9') || (toupper(digito) >= 'A' && toupper(digito) <= 'F'));
}

int main() {

    char digit;
    printf("Insert the digit: ");
    scanf("%c", &digit);

    printf("Is it a hexa digit? ");
    if (is_digit(digit)) {
        printf("yes\n");
    } else {
        printf("no\n");
    }

    return 0;
}

Macros tendem a ser difíceis de debugging pelo fato que eles acontecem antes de compilar o código. 

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

@kgin  Eu ainda não conhecia a função toupper(), serviu muito bem para este caso. Sobre definir um macro, esse é um dos exercícios da seção de Pré-processador do livro Practical C, por isso faz sentido usar macro, apenas para praticar, porém você tem razão sobre o uso de macros e debug, obrigado cara.

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

@Lim4 recomendo dar uma olhada nessa outras também

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

#define T_BUFFER 124

int
verifica_hex(char *numero);

int main(void)
{
    char buffer[T_BUFFER];
    printf("Digite um numero hexadecimal:");
    fgets(buffer, T_BUFFER, stdin);
    /* retira o newline */
    buffer[strlen(buffer)-1] = '\0';
    
    if (verifica_hex(buffer)) {
        printf("O numero e um hexadecimal valido!\n");
        printf("%s convertido para decimal e %li\n", buffer, strtol(buffer, NULL, 16));
    } else {
        printf("%s não e um numero hexadecimal valido!\n", buffer);
    }
    
    printf("Pressione enter para encerrar o programa!\n");
    getchar();
    return(0);
}

int
verifica_hex(char *numero)
{
    int
        quantidade_chars = 0,
        contador;
    
    for (contador = 0; numero[contador]; contador++) {
        if (isxdigit(numero[contador])) {
            quantidade_chars++;
        }
    }
    
    if (quantidade_chars == strlen(numero)) {
        return(quantidade_chars);
    }
    return(0);
}

Visite o site cplusplus.com lá tem vários exemplos.

 

4 horas atrás, Lim4 disse:

@kgin  Eu ainda não conhecia a função toupper(), serviu muito bem para este caso. Sobre definir um macro, esse é um dos exercícios da seção de Pré-processador do livro Practical C, por isso faz sentido usar macro, apenas para praticar, porém você tem razão sobre o uso de macros e debug, obrigado cara.

se você for fazer uma macro desse tipo eu não recomendo ser dependente de uma função externa

exemplo

#define _UP(x) (((x >= 'a') && (x <= 'z')?x-32:x))
#define _IS_HEX(x) ((x >= '0' && x <= '9') || (_UP(x) >= 'A' && _UP(x) <= 'F'))

Deixo como exercício final você descobrir o que essa maçaroca de macros vai ser quando passar no pré-processador, Já deixo avisado que não vai ser bonito 😛

  • 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!