我有一个程序接受16位十六进制值作为输入。我想要做的是让它提取这些值。例如,如果我输入:
0xFFFF 0x0000 0x1234
我希望程序迭代这个输入字符串,并一次提取一个十六进制值。此外,如果字符串不是正确的0x ****格式,包含无效字符,如$ 0x5544,或无效的十六进制数字,如0x45GG,那么我希望程序打印出来"无效输入"
我目前有一个指针,我在每个字符串中递增,但我想测试十六进制值,看看它们是否在允许的十六进制数字(0-F)之间,这是我不知道怎么做
答案 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;
}