我正在尝试在C中创建一个宏,它可以判断char是否为十六进制数(0-9 a-z A-Z)
#define _hex(x) (((x) >= "0" && (x) <= "9" )||( (x) >= "a" && (x) <= "z") || ((x) >= "A" && (x) <= "Z") ? "true" : "false")
这是我提出的,但它不适合像这样的循环
char a;
for(a = "a" ; a < "z";a++){
printf("%s => %s",a, _hex(a));
}
它出错了
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
答案 0 :(得分:9)
“a”是指向字符串“a”的指针。您想要将char与'a'进行比较。
#define _hex(x) (((x) >= '0' && (x) <= '9' )||( (x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z') ? "true" : "false")
但您也可以使用isalnum(x)
- 如果字符是数字或字符,则返回true。
或isxdigit(x)
如果真的应该是十六进制检查。
答案 1 :(得分:2)
然后使用isxdigit()
。
答案 2 :(得分:1)
您在测试循环中犯了与在宏中一样的错误。
for(a = "a" ; a < "z";a++){
应该是:
for(a = 'a' ; a < 'z'; a++){
当然,明智的解决方案是使用isxdigit()
中定义的ctype.h
作为宏(如果您感兴趣,可以查看)。
答案 3 :(得分:0)
您还需要更改“for”循环以循环“a”到“z”,而不是“a”到“z”。
答案 4 :(得分:0)
我建议不要将宏用于此类功能。 C99支持内联函数,只需写入
inline char *_hex(char c)
{
... write there what you need in readable form ...
}