Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何查找给定字符串是否符合十六进制表示法,例如不带正则表达式的0x34FF? p> >代码> 0x[09-FA-F] + ,但如何在纯C++中实现它?< /P> < P>调用并检查错误。 < P>尝试以下 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; } bool-IsHex(const-std::string&str){ 如果(str.length下面的例子,该方法检查任何基数有效基 二进制到基32 /* 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; } /*strspn有效数字示例*/ #包括 #包括 #包括 #定义二进制_基2/*定义二进制基*/ #定义八进制8/*定义八进制*/ #定义十进制基数10/*定义十进制基数*/ #定义十六进制16/*定义十六进制*/ #定义BASE32_BASE 32/*定义BASE32 BASE*/ bool isValidNumber4Base(常量字符*numStr,整数基) { 常量字符*validBinary=“01”; const char*validOctal=“01234567”; const char*validDecimal=“0123456789”; const char*validHex=“0123456789abcdefxABCDEFX”; const char*validBase32=“0123456789abcdefghijklmnopqrstuvab defghijklmnopqrstuv”; const char*validNumber=NULL; validNumber=(基数==二进制基数)?validBinary:((基数==八进制基数)?ValidDoctal: (base==十进制基数)?validDecimal:(base==十六进制)?validHex:(base==BASE32\u base)?validBase32:NULL); if(validNumber==NULL) { 使用C++11,您可以轻松完成以下任务: std::string str = "FF22ABCD16ZZ"; if (std::all_of(str.begin(), str.end(), ::isxdigit)) { std::cout << str << " contains only hexadecimal digits" << std::endl; } std::string str=“FF22ABCD16ZZ”; if(std::all_of(str.begin(),str.end(),::isxdigit)){ std::cout_C++_String_Pattern Matching - Fatal编程技术网

如何查找给定字符串是否符合十六进制表示法,例如不带正则表达式的0x34FF? p> >代码> 0x[09-FA-F] + ,但如何在纯C++中实现它?< /P> < P>调用并检查错误。 < P>尝试以下 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; } bool-IsHex(const-std::string&str){ 如果(str.length下面的例子,该方法检查任何基数有效基 二进制到基32 /* 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; } /*strspn有效数字示例*/ #包括 #包括 #包括 #定义二进制_基2/*定义二进制基*/ #定义八进制8/*定义八进制*/ #定义十进制基数10/*定义十进制基数*/ #定义十六进制16/*定义十六进制*/ #定义BASE32_BASE 32/*定义BASE32 BASE*/ bool isValidNumber4Base(常量字符*numStr,整数基) { 常量字符*validBinary=“01”; const char*validOctal=“01234567”; const char*validDecimal=“0123456789”; const char*validHex=“0123456789abcdefxABCDEFX”; const char*validBase32=“0123456789abcdefghijklmnopqrstuvab defghijklmnopqrstuv”; const char*validNumber=NULL; validNumber=(基数==二进制基数)?validBinary:((基数==八进制基数)?ValidDoctal: (base==十进制基数)?validDecimal:(base==十六进制)?validHex:(base==BASE32\u base)?validBase32:NULL); if(validNumber==NULL) { 使用C++11,您可以轻松完成以下任务: std::string str = "FF22ABCD16ZZ"; if (std::all_of(str.begin(), str.end(), ::isxdigit)) { std::cout << str << " contains only hexadecimal digits" << std::endl; } std::string str=“FF22ABCD16ZZ”; if(std::all_of(str.begin(),str.end(),::isxdigit)){ std::cout

如何查找给定字符串是否符合十六进制表示法,例如不带正则表达式的0x34FF? p> >代码> 0x[09-FA-F] + ,但如何在纯C++中实现它?< /P> < P>调用并检查错误。 < P>尝试以下 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; } bool-IsHex(const-std::string&str){ 如果(str.length下面的例子,该方法检查任何基数有效基 二进制到基32 /* 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; } /*strspn有效数字示例*/ #包括 #包括 #包括 #定义二进制_基2/*定义二进制基*/ #定义八进制8/*定义八进制*/ #定义十进制基数10/*定义十进制基数*/ #定义十六进制16/*定义十六进制*/ #定义BASE32_BASE 32/*定义BASE32 BASE*/ bool isValidNumber4Base(常量字符*numStr,整数基) { 常量字符*validBinary=“01”; const char*validOctal=“01234567”; const char*validDecimal=“0123456789”; const char*validHex=“0123456789abcdefxABCDEFX”; const char*validBase32=“0123456789abcdefghijklmnopqrstuvab defghijklmnopqrstuv”; const char*validNumber=NULL; validNumber=(基数==二进制基数)?validBinary:((基数==八进制基数)?ValidDoctal: (base==十进制基数)?validDecimal:(base==十六进制)?validHex:(base==BASE32\u base)?validBase32:NULL); if(validNumber==NULL) { 使用C++11,您可以轻松完成以下任务: std::string str = "FF22ABCD16ZZ"; if (std::all_of(str.begin(), str.end(), ::isxdigit)) { std::cout << str << " contains only hexadecimal digits" << std::endl; } std::string str=“FF22ABCD16ZZ”; if(std::all_of(str.begin(),str.end(),::isxdigit)){ std::cout,c++,string,pattern-matching,C++,String,Pattern Matching,,您可以使用std::string的内置方法来检查字符串的第一部分是否为文本“0x”,并且字符串的其余部分仅包含允许的字符。以下是与问题中给出的正则表达式等效的值: bool is_hex_notation(std::string const& s) { return s.compare(0, 2, "0x") == 0 && s.size() > 2 && s.find_first_not_of("0123456789a

,您可以使用
std::string
的内置方法来检查字符串的第一部分是否为文本“0x”,并且字符串的其余部分仅包含允许的字符。以下是与问题中给出的正则表达式等效的值:

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;
}

您可以改为使用此strspn来检查有效基数。

< C++ >下面的例子,该方法检查任何基数有效基 二进制到基32

/* 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;
}
/*strspn有效数字示例*/
#包括
#包括
#包括
#定义二进制_基2/*定义二进制基*/
#定义八进制8/*定义八进制*/
#定义十进制基数10/*定义十进制基数*/
#定义十六进制16/*定义十六进制*/
#定义BASE32_BASE 32/*定义BASE32 BASE*/
bool isValidNumber4Base(常量字符*numStr,整数基)
{
常量字符*validBinary=“01”;
const char*validOctal=“01234567”;
const char*validDecimal=“0123456789”;
const char*validHex=“0123456789abcdefxABCDEFX”;
const char*validBase32=“0123456789abcdefghijklmnopqrstuvab defghijklmnopqrstuv”;
const char*validNumber=NULL;
validNumber=(基数==二进制基数)?validBinary:((基数==八进制基数)?ValidDoctal:
(base==十进制基数)?validDecimal:(base==十六进制)?validHex:(base==BASE32\u base)?validBase32:NULL);
if(validNumber==NULL)
{

使用C++11,您可以轻松完成以下任务:

std::string str = "FF22ABCD16ZZ";

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

std::cout您可以使用
std::count\u if
检查计数是否等于大小

std::string_视图v(“0xa3”);
bool correctPrefix=v.rfind(“0x”,0)==0&&v.length()>2;
correctPrefix=correctPrefix?std::count_if(v.begin()+2,
v、 end(),
::isxdigit)=v.length()-2:false;

您考虑过使用循环吗?请参阅此处了解解决方案(转换为十六进制并检查是否成功)虽然在这个例子中它非常简单,但是当你尝试为非ASCII字符串编写正则表达式替换,或者替换更复杂的搜索字符串时,它变得混乱。我希望你不是过早地优化。你知道新C++标准的变化吗?纯C++现在包括正则表达式。这是PROB。最好的解决方案。(在已经发布的另外两个解决方案中,一个完全是意大利面,形式上是错误的,另一个包含一个细微的错误。因此,你自己写的任何东西都将是非常重要的。)@James,如果问题也包含相同的错误,那么另一个答案只包含一个错误。如果您碰巧知道rsk82正在检查的任何语法也允许十六进制表示法中的大写“X”,那么请更正问题,然后我们中的一个人也可以更正答案。(如果您提到的错误是其他错误,那么它太微妙了,我无法注意到,所以请您自己更正。)我不知道如何使用strtoul检查错误。看起来strtoul(str,NULL,16)返回十六进制值,而不管str是否有前导“0x”或者不。不要将0作为第二个参数传递。在4MB十六进制文件上使用strtoul会给我以下错误:错误::结果太大错误:错误号:34如果十六进制字符串太大,此方法将失败。尽管OP没有在其正则表达式中反映这一点,
“0X1a”
也是一个合法的十六进制值。这很好,我喜欢。但是,这表示需要强制转换:
[](无符号字符c){return std::isxdigit(c);}
它似乎可以工作,但这个函数非常慢。