我正在尝试创建一个简单的程序或函数来获取用户输入,这些输入可能是有效的十六进制数。
我正在尝试找出一种方法来验证它是一个正确的十六进制值,如果它是真的则返回十六进制值,如果它是假的则返回错误消息。
我在考虑一个函数,它检查每个字符以确保其0-9
或A-F
,但无法考虑如何实现它。
感谢。
答案 0 :(得分:19)
给定const char *s
,如果要确定s
指向的字符串中的每个字符是否都是有效的十六进制数字,您可以使用:
if (s[strspn(s, "0123456789abcdefABCDEF")] == 0)
{
/* valid */
}
答案 1 :(得分:1)
这应该做的工作
int validate_hex(const char* hex){
while(*hex != 0){
if(*hex < '0' || *hex > '9')
return 0;
if(*hex < 'A' || *hex > 'F')
return 0;
hex++;
}
return 1;
}
答案 2 :(得分:1)
使用他的方法添加到caf的答案,此功能适用于从二进制到base32的所有基数。您可以轻松检查有效数字。
#define BINARY_BASE 2 /*Defining binary base*/
#define OCTAL_BASE 8 /*Defining octal base*/
#define DECIMAL_BASE 10 /*Defining decimal base*/
#define HEXA_BASE 16 /*Defining hexa-decimal base*/
#define BASE32_BASE 32 /*Defining base32 base*/
bool isValidNumber4Base(const char* numStr,int base)
{
const char *validBinary = "01";
const char *validOctal = "01234567";
const char *validDecimal = "0123456789";
const char *validHex = "0123456789abcdefxABCDEFX";
const char *validBase32 = "0123456789abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUV";
const char *validNumber = NULL;
validNumber = (base == BINARY_BASE) ? validBinary : ((base == OCTAL_BASE) ? validOctal :
(base == DECIMAL_BASE) ? validDecimal : (base == HEXA_BASE) ? validHex : (base == BASE32_BASE) ? validBase32 : NULL);
if(validNumber == NULL)
{
fputs("Invalid base encountered",stderr);
exit(EXIT_FAILURE);
}
return (!numStr[strspn(numStr,validNumber)]) ? true : false;
}
/*Test Method For Hexa-deicmal */
int main ()
{
char *hexa_str = "0x7FFF";
printf("Valid Hexa : %s\n",isValidNumber4Base(hexa_str,HEXA_BASE) == true ? "true" : "false");
return 0;
}
答案 3 :(得分:0)
这样的事情(因为你坚持认为它不是作业,我会填写):
int CheckMyString(const char *aStr)
{
const char *curr = aStr;
while (*curr != 0)
{
if (('A' <= *curr && *curr <= 'F') || ('a' <= *curr && *curr <= 'f') || '0' <= *curr && *curr <= '9'))
{
++curr;
}
else
{
return 0;
}
}
return 1;
}
答案 4 :(得分:0)
就像strtod一样,标准C库中有strtoul用于从文本转换为无符号长整数。
以前一个问题为例:
#include <errno.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
unsigned int intValue;
char *e,s[100];
fgets(s,100,stdin); if( s[strlen(s)-1]=='\n' ) s[strlen(s)-1]=0;
errno=0;
intValue= strtoul(s,&e,16);
if( *e || errno==EINVAL || errno==ERANGE )
puts("error");
else
printf("intValue=0x%04x\n", intValue);
如果你没有指定一个基数,它可以读取普通整数,十六进制(如果前缀为0x),八进制(如果你有一个前导零)(但是大多数人都忘了这一点而且我遇到了人们遇到的问题)为格式化设置了前导零,这搞砸了转换)