Ir ao conteúdo

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


Ir à solução Resolvido por kgin,

Posts recomendados

Postado

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
  • Solução
Postado

@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
Postado

@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
Postado

@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

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...