方法一:字符串验证
#include <iostream>
#include <string>
using namespace std;
/*
IPv6的错误形式可能有如下:
1.多了0
2.出现::
3.字符不在0-9 a-f A-F之间
IPv4错误形式可能有如下:
1.多了首位'0'
2.超过0-255范围
3.首位是"."或出现的".."
4.不能为 '.'和’0-9‘ 之外的数字
5.不为4段
*/
class SolutionIP{
public:
// 判断类型 false:ipv4 true:ipv6
bool type(string &s){
for(auto ch:s){
if(ch=='.') return false;
if(ch==':') return true;
}
}
bool checkV6(string &s){
int ch_cnt = 0;
for(int i=0; i<s.size(); ++i){
if(s[i]==':'){
if(ch_cnt>4 || ch_cnt==0) return false;
ch_cnt = 0;
} else if(!( s[i]<='9' && s[i]>='0'
||s[i]<='F' && s[i]>='A'
||s[i]<='f' && s[i]>='a'
)){
return false;
} else {
ch_cnt++;
}
}
return true;
}
bool checkV4(string &s){
int k=0; //记录每个segment起始位置
int pCnt=0; //记录'.'的个数
s.push_back('.'); //方便atoi使用
for(int i=0; i<s.size(); ++i){
if(s[i] == '.'){
s[i] = '\0'; //方便atoi使用
if( s[k]=='\0' //连续..或第一个为.的情况
|| (s[k]=='0' && strlen(&s[k])>1) //以0开头的情况
|| !(atoi(&s[k])<=255 && atoi(&s[k])>=0)) //不符合区间范围
{
return false;
}
k = i+1;
++pCnt;
} else if(!(s[i]>='0' && s[i]<='9')) { //包含非 0-9或'.' 的情况
return false;
}
}
if(pCnt != 3+1) return false; //'.'不是3段,最后一个1是自己加的
return true;
}
/**
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
string solve(string IP) {
// write code here
if(type(IP)){
if(!checkV6(IP))
return "Neither";
return "IPv6";
} else {
if(!checkV4(IP))
return "Neither";
return "IPv4";
}
}
};
int main() {
std::cout << "[CPP IP检查测试]" << std::endl;
string input = "0.0.1.1";
SolutionIP solution;
string result = solution.solve(input);
cout << "input:\t" << input << endl;
cout << "result:\t" << result << endl;
return 0;
}
方法二:正则表达式
bool CheckIPAddrIsVaild(string str)
{
regex reg("(?=(\\b|\\D))(((\\d{1,2})|(1\\d{1,2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d{1,2})|(1\\d{1,2})|(2[0-4]\\d)|(25[0-5]))(?=(\\b|\\D))");
return regex_match(str, reg);
}
运行结果: