输入&正确验证十六进制值

时间:2011-12-05 23:28:54

标签: c validation input hex

我正在尝试创建一个简单的程序或函数来获取用户输入,这些输入可能是有效的十六进制数。

我正在尝试找出一种方法来验证它是一个正确的十六进制值,如果它是真的则返回十六进制值,如果它是假的则返回错误消息。

我在考虑一个函数,它检查每个字符以确保其0-9A-F,但无法考虑如何实现它。

感谢。

5 个答案:

答案 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),八进制(如果你有一个前导零)(但是大多数人都忘了这一点而且我遇到了人们遇到的问题)为格式化设置了前导零,这搞砸了转换)