检查charArray是否只有十六进制数字

时间:2014-10-16 14:08:59

标签: c hex arrays

我有一个程序接受16位十六进制值作为输入。我想要做的是让它提取这些值。例如,如果我输入:

0xFFFF 0x0000 0x1234

我希望程序迭代这个输入字符串,并一次提取一个十六进制值。此外,如果字符串不是正确的0x ****格式,包含无效字符,如$ 0x5544,或无效的十六进制数字,如0x45GG,那么我希望程序打印出来"无效输入"

我目前有一个指针,我在每个字符串中递增,但我想测试十六进制值,看看它们是否在允许的十六进制数字(0-F)之间,这是我不知道怎么做

1 个答案:

答案 0 :(得分:2)

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

bool isValid1(const char *s){
    unsigned long v;
    char *endp;
    errno = 0;
    v = strtoul(s, &endp, 16);
    return !*endp && v < 0x10000 && errno != ERANGE;
}

bool isValid2(const char *s){//limited to four HEX characters : 0xXXXX
    if(strlen(s)!=6)
        return false;
    return 
        *s == '0' && tolower(s[1])=='x' &&
        isxdigit(s[2]) && isxdigit(s[3]) && isxdigit(s[4]) && isxdigit(s[5]);
}

int main(void){
    char data[] = 
        "0xFFFF 0x0000 0x1234 0x01234 $0xFFFF 0x45GG 0x12345\n";
    char *p = data;
    for(p = strtok(p, " \n"); p ; p = strtok(NULL, " \n")){
        if(!isValid1(p))
            printf("isValid1(%s) : invalid input\n", p);
        if(!isValid2(p))
            printf("isValid2(%s) : invalid input\n", p);
    }
    return 0;
}