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
C++ 用C++;没有正则表达式_C++_String_Parsing_C++23 - Fatal编程技术网

C++ 用C++;没有正则表达式

C++ 用C++;没有正则表达式,c++,string,parsing,c++23,C++,String,Parsing,C++23,我创建了一个函数is_integer,它接受参数std::string_view并返回bool,无论给定的字符串是否限定为整数 出于某些原因,我包括了一元运算符-和+ 我使用start\u with方法检查前缀 我使用C++23或C++2b中的contains来检查指定的字符集是否包含这样的内容 我的是\u整数函数源代码: bool是数字(const std::string\u视图和输入字符串){ 枚举类编号\u标志{ 十进制、二进制、八进制、十六进制 }; auto it=input_st

我创建了一个函数
is_integer
,它接受参数
std::string_view
并返回
bool
,无论给定的字符串是否限定为整数

  • 出于某些原因,我包括了一元运算符
    -
    +
  • 我使用
    start\u with
    方法检查前缀
  • 我使用
    C++23
    C++2b
    中的
    contains
    来检查指定的字符集是否包含这样的内容
我的
是\u整数
函数源代码:

bool是数字(const std::string\u视图和输入字符串){
枚举类编号\u标志{
十进制、二进制、八进制、十六进制
};
auto it=input_string.begin();
std::string新输入字符串;
布尔结果=真;
数字标志iflag;
///首先检查它是否为空0
if(input_string.empty()){
返回false;
}
///使用一元正运算符和负运算符1
if(input_string.start_with('-')| | input_string.start_with('+')){
++它;
new_input_string=input_string.substr(1,input_string.size()-1);
}否则{
新建输入字符串=输入字符串;
}
///不同格式的分类(一)
///十进制-以“1-9”非零数字开头,然后是数字“0-9”`
///二进制-以'0b'或'0b'开头,然后仅以'0'和'1'开头`
///八进制-以'0'零位开头,然后是有限的数字'0-7`
///十六进制-以“0x”或“0x”开头,然后是数字“0-9”和有限的字母“a-f”或“a-f”`
///以(前缀)过程2开始
如果(!new_input_string.以('0')开头){
//小数
iflag=数字\标志::十进制;
++它;
}else if(新的输入字符串以(“0b”)开头|新的输入字符串以(“0b”)开头){
//二进制的
iflag=数字标志::二进制;
it+=2;
}else if(新的输入字符串以('0')开头){
//八进制
iflag=数字标志::八进制;
++它;
}else if(新的输入字符串。以(“0x”)开头?|新的输入字符串。以(“0x”)开头){
//十六进制
iflag=数字标志::十六进制;
it+=2;
}否则{
返回false;
}
///不同格式的分类(二)
///十进制-以“1-9”非零数字开头,然后是数字“0-9”`
///二进制-以'0b'或'0b'开头,然后仅以'0'和'1'开头`
///八进制-以'0'零位开头,然后是有限的数字'0-7`
///十六进制-以“0x”或“0x”开头,然后是数字“0-9”和有限的字母“a-f”或“a-f”`
使用std::literals::operator“”sv;
///在身体程序3中
for(;it!=输入_string.end();++it){
交换机(iflag){
使用enum number_标志;
大小写小数:{
如果(“0123456789”sv.包含(*it)){
结果=真;
打破
}否则
返回false;
}
大小写二进制:{
如果(“01”sv.包含(*it)){
结果=真;
打破
}否则
返回false;
}
八进制:{
如果(“01234567”sv.包含(*it)){
结果=真;
打破
}否则
返回false;
}
十六进制:{
如果(“0123456789ABCDEFABCDDEF”sv.包含(*it)){
结果=真;
打破
}否则
返回false;
}
默认值:{
返回false;
}
}
}
///要做:
///(1)数字分隔符`'`
///(2)后缀'z','u','l'。。。
///最后程序4
返回结果;
}
测试:

1192837 -> true
+23123213 -> true
-1928739382 -> true
0b101011 -> true
0B1010101 -> true
0b18100100 -> false
071325612 -> true
01238791 -> false
0x032 -> false (unexpected)
0xff0ca8 -> false (unexpected)
<any single character excluding plus and minus> -> true (unexpected)
<any single character excluding plus and minus and next with digits> -> true (unexpected)
1192837->true
+23123213->true
-1928739382->true
0b101011->true
0B1010101->true
0b18100100->false
071325612->true
01238791->false
0x032->false(意外)
0xff0ca8->false(意外)
->真(意外)
->真(意外)

我如何解决这些意外结果导致的问题?我的代码中是否有错误(很可能)?

为什么不简单地使用例如?它有内置的字符串验证功能,可以帮助您查看所有字符串是否都是整数?这不是一个很好的代码(大多数人都认为它很糟糕)。为什么<代码>结果= false;goto最终声明而不是简单地
返回false
else if(new_input_string.以('0')){…}else if(new_input_string.以('0x')|开始新_input_string.以('0x'){…}开始,你没有十六进制值,因为所有以
0x
0x
开头的东西也都以
0
@fabian开头,那就是
如果(!new_input_string.以('0')开头)
。值得注意的是,这意味着即使它以
'q'
或其他东西开头,它仍然会将字符串的其余部分视为十进制整数。