9 Stimmen

Wie findet man heraus, ob eine gegebene Zeichenkette der Hex-Notation entspricht, z. B. 0x34FF ohne regex?

In Regex würde es lauten 0x[0-9a-fA-F]+ aber wie kann man das in reinem C++ erreichen?

21voto

Rob Kennedy Punkte 158781

Sie können die eingebauten Methoden von std::string um zu prüfen, ob der erste Teil der Zeichenkette das Literal "0x" ist und ob der Rest der Zeichenkette nur die erlaubten Zeichen enthält. Hier ist das Äquivalent zu dem in der Frage angegebenen regulären Ausdruck:

bool is_hex_notation(std::string const& s)
{
  return s.compare(0, 2, "0x") == 0
      && s.size() > 2
      && s.find_first_not_of("0123456789abcdefABCDEF", 2) == std::string::npos;
}

7voto

Hayk Avetisyan Punkte 61

Mit C++11 können Sie das problemlos tun:

std::string str = "FF22ABCD16ZZ";

if (std::all_of(str.begin(), str.end(), ::isxdigit)) {
    std::cout << str << " contains only hexadecimal digits" << std::endl;
}

3voto

bmargulies Punkte 94152

Rufen Sie an. strtoul und prüfen, ob ein Fehler vorliegt.

2voto

JaredPar Punkte 699699

Versuchen Sie Folgendes

bool IsHex(const std::string& str) {
  if (str.length < 3 || str[0] != '0') {
    return false;
  }

  if (str[1] != 'x' && str[1] != 'X') {    
    return false;
  }

  for (size_t i = 2; i < str.length; i++) {
    char current = str[i];
    if (current >= '0' && current <= '9') {
      continue;
    }

    if (current >= 'A' && current <= 'F') {
      continue;
    }

    if (current >= 'a' && current <= 'f') {
      continue;
    }

    return false;
  }

  return true;
}

0voto

HaseeB Mir Punkte 793

Sie könnten stattdessen Folgendes verwenden strspn um auf eine gültige Basis zu prüfen. http://www.cplusplus.com/reference/cstring/strspn/

Beispiel unten in C++ prüft diese Methode auf eine beliebige gültige Radixbasis von binär-zu-basis32

/* strspn valid-number example */

#include<iostream>
#include<cstdlib>
#include<cstring>

#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)
    {
        std::cerr<<"Invalid base encountered"<<std::endl;
        exit(EXIT_FAILURE);
    }

    return (!numStr[strspn(numStr,validNumber)]) ? true : false;
}

/*Test Method */
int main ()
{
  char *hexa_str = "0xFF";  
  std::cout<<"Valid Hexa : "<<std::boolalpha<<isValidNumber4Base(hexa_str,HEXA_BASE)<<std::endl;        
  return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X