验证IP地址

题目

编写一个函数来验证输入的字符串是否是有效的 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值