2010-05-09 4 views
1

Je suis en train de faire une macro en C qui peut dire si un caractère est un nombre hexadécimal (0-9 az AZ)définir macro en C ne fonctionnera pas

#define _hex(x) (((x) >= "0" && (x) <= "9")||((x) >= "a" && (x) <= "z") || ((x) >= "A" && (x) <= "Z") ? "true" : "false") 

Ce que j'ai venir avec, mais il ne fonctionne pas avec une boucle comme celui-ci

char a; 
    for(a = "a" ; a < "z";a++){ 
     printf("%s => %s",a, _hex(a)); 
    } 

donne une erreur

test.c:8: warning: assignment makes integer from pointer without a cast 
test.c:8: warning: comparison between pointer and integer 
test.c:9: warning: comparison between pointer and integer 
test.c:9: warning: comparison between pointer and integer 
test.c:9: warning: comparison between pointer and integer 
test.c:9: warning: comparison between pointer and integer 
test.c:9: warning: comparison between pointer and integer 
test.c:9: warning: comparison between pointer and integer 
+5

Ce n'est pas ce que signifie le nombre hexadécimal. Un chiffre hexadécimal est 0-9 ou A-F. Vous vérifiez si un caractère est alphanumérique. –

Répondre

9

« a » est un pointeur sur une chaîne « a ». Vous voulez comparer le caractère à 'a' à la place.

#define _hex(x) (((x) >= '0' && (x) <= '9')||((x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z') ? "true" : "false") 

Mais vous pouvez aussi utiliser à la place isalnum(x) - il retourne vrai si le caractère est un chiffre ou un caractère.

Ou isxdigit(x) si c'était vraiment censé être une vérification hexadécimale.

+2

+1 pour la suggestion d'isalme. –

+0

mon intention était a-f; p pour les numéros HEX :) mais n'avait pas implémenté dans cet exemple – Spidfire

+0

s'il vous plaît, corrigez votre réponse en remplaçant 'zZ' par' fF'. – jweyrich

2

Utilisez ensuite isxdigit().

0

Vous devez également modifier votre boucle "for" pour qu'elle boucle sur la plage "a" à "z" plutôt que sur "a" à "z".

0

Je suggère de ne pas utiliser macro pour ces fonctions. C99 prend en charge les fonctions en ligne il suffit d'écrire

inline char *_hex(char c) 
{ 
    ... write there what you need in readable form ... 
} 
1

Vous avez fait la même erreur dans votre boucle de test que dans la macro.

for(a = "a" ; a < "z";a++){ 

devrait être:

for(a = 'a' ; a < 'z'; a++){ 

Et bien sûr, la solution raisonnable est d'utiliser isxdigit() défini dans ctype.h comme une macro (vous pouvez jeter un oeil si vous êtes intéressé).

Questions connexes