题目
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址
IPv4 地址由十进制数和点来表示,每个地址包含 4 个十进制数,其范围为 0 - 255, 用 (“.”) 分割。比如,172.16.254.1;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
IPv6 地址由 8 组 16 进制的数字来表示,每组表示 16 比特。这些组数字通过 (“:”) 分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address 地址 (即,忽略 0 开头,忽略大小写)。
然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (:😃 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。
说明:你可以认为给定的字符串里没有空格或者其他特殊字符。
数据范围:字符串长度满足 5<=n<=50
进阶:空间复杂度 O(n),时间复杂度 O(n)
收获
1:这道题主要考察的是对字符串的基本的处理能力,定义一个字符串直接string即可,可以直接采取cin的方法进行输入
2:string型字符串的相加的方法直接使用+就可以将另一个字符串或者字符相加即可~,还有对每一位数字的判断将其-‘0’得到的就是对应的阿拉伯数字的真实值就可以进行判断
3:在比较大小的时候不要写’a’>s[i]>‘Z’,要写成(s[i]>‘Z’&&s[i]<‘a’)这种形式
4:对IP地址的每一个值使用IP[i]进行判断,如果不是’.‘则使用temp进行累加,最后直到遇到’.'在进行判断,同时使用tempnum进行判断数值是否符合所给范围
代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bool JudgeIpv4(string IP){
string temp;
int tempnum=0;
for(int i=0;i<IP.length();i++){
if(IP[i]!='.')
temp+=IP[i];
else
{
if((temp.length()>1&&temp[0]=='0')||temp.length()==0)
return false;
for(int j=0;j<temp.length();j++){
tempnum*=10;
tempnum+=(temp[j]-'0');
}
if(tempnum<0||tempnum>255)
return false;
temp="";
tempnum=0;
}
}
// 对.后没有判断到的继续判断
if((temp.length()>1&&temp[0]=='0')||temp.length()==0)
return false;
for(int j=0;j<temp.length();j++){
tempnum*=10;
tempnum+=(temp[j]-'0');
}
if(tempnum<0||tempnum>255)
return false;
return true;
}
bool JudgeIpv6(string IP){
string temp;
for(int i=0;i<IP.length();i++){
if(IP[i]!=':')
temp+=IP[i];
else{
if(temp.length()>4||temp.length()<=0)
return false;
for(int j=0;j<temp.length();j++){
if(temp[j]<'0'||(temp[j]>'9'&&temp[j]<'A')||(temp[j]>'F'&&temp[j]<'a')||temp[j]>'f')
return false;
}
temp="";
}
}
if(temp.length()>4||temp.length()<=0)
return false;
for(int j=0;j<temp.length();j++){
if(temp[j]<'0'||(temp[j]>'9'&&temp[j]<'A')||(temp[j]>'F'&&temp[j]<'a')||temp[j]>'f')
return false;
}
return true;
}
string solve(string IP) {
// write code here
if(JudgeIpv4(IP)){
return "IPv4";
}else if (JudgeIpv6(IP)){
return "IPv6";
}else
return "Neither";
}
int main()
{
string IP;
cin>>IP;
cout<<solve(IP);
return 0;
}