如何检查char*在C中是否只有十六进制字符?

如何检查char*在C中是否只有十六进制字符?,c,C,我有一个char*argv[],我只想检查它是否包含有效的十六进制值。例如,我试图编写一个函数,如boolishex(argv[1]),并说明它是否只有十六进制。如何确保它只有数字0-9和字母a-f?我已经找到了所有alpha或数字的方法,但我不确定是否有更简单的方法来处理hex。谢谢。把它们读作数字:它的值应该是 介于48(字符0)和57(字符9)之间 介于65(字符A)和70(字符F)之间 介于97(字符a)和102(字符f)之间 (值取自ASCII表,如:)。尝试isxdigit(),

我有一个
char*argv[]
,我只想检查它是否包含有效的十六进制值。例如,我试图编写一个函数,如
boolishex(argv[1])
,并说明它是否只有十六进制。如何确保它只有数字0-9和字母a-f?我已经找到了所有alpha或数字的方法,但我不确定是否有更简单的方法来处理hex。谢谢。

把它们读作数字:它的值应该是

  • 介于48(字符0)和57(字符9)之间
  • 介于65(字符A)和70(字符F)之间
  • 介于97(字符a)和102(字符f)之间

(值取自ASCII表,如:)。

尝试
isxdigit()
,在
中定义,它将匹配数字0到9以及大小写字母A到F。在BSD和macOS上,您也可以使用
ishexnumber()

您可以通过标准函数检查字符串内容与任何字符集。它计算仅由指定字符组成的指定字符串的初始段的长度:

unsigned hex_count = strspn(arg, "0123456789abcdef");
_Bool is_all_hex = !arg[hex_count];    // is arg[hex_count] a string terminator?

对于性能合理的解决方案,您可以使用静态查找表:

#include <limits.h>

int isHex(char c)
{
    static int s_hex_digit[1 << CHAR_BIT] = {
        ['0'] = 1, ['1'] = 1, ['2'] = 1, ['3'] = 1, ['4'] = 1,
        ['5'] = 1, ['6'] = 1, ['7'] = 1, ['8'] = 1, ['9'] = 1,
        ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1,
        ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1
    };
    return s_hex_digit[(unsigned char)c];
}
#包括
int isHex(字符c)
{

静态int s_hex_digit[1“我已经找到了所有alpha或数字的方法,但我不确定是否有更简单的方法来使用hex”。在发布问题时,请确保包含您对该问题的理解。虽然我已经回答了,但如果我有更多的上下文,我的答案可能更适合您。“…和字母a-f”。那么
'A'
'F'
呢?你的意思是说
isxdigit()
ishxnumber
不是一个标准函数。
ishxnumber()
是非标准函数。这似乎是一个BSD ism,在glibc没有学会它的人中有些不同寻常。