蓝桥杯08 java IP判断

该博客主要介绍了一个Java程序,用于判断输入的IP地址字符串是否合法。程序首先检查字符串的基本格式,包括长度、首尾字符、分隔符等,然后逐个解析IP的四部分,确保它们都在[0,255]范围内且无前导零。通过示例输入和输出,展示了程序的正确性和边界情况处理。
摘要由CSDN通过智能技术生成

题目描述

在基于Internet的程序中,我们常常需要判断一个IP字符串的合法性。 
合法的IP是这样的形式: 
A.B.C.D 
其中A、B、C、D均为位于[0, 255]中的整数。为了简单起见,我们规定这四个整数中不允许有前导零存在,如001这种情况。 
现在,请你来完成这个判断程序

输入

输入由多行组成,每行是一个字符串,输入由“End of file”结束。 
字符串长度最大为30,且不含空格和不可见字符

输出

对于每一个输入,单独输出一行 
如果该字符串是合法的IP,输出Y,否则,输出N

样例输入

1.2.3.4
a.b.c.d
267.43.64.12
12.34.56.bb
210.43.64.129
-123.4.5.6

样例输出

Y
N
N
N
Y
N

思路:

      题目中的IP地址是我们常见的IPv4,十进制显示,整数最大不超过255。要符合题意,需满足以下条件:

1.输入的字符串不为NULL

2.输入的字符串长度要在7-15位之间(x.x.x.x-xxx.xxx.xxx.xxx)

3.输入的字符串开头和结尾不能是.  (.x.x.x或x.x.x.x.)

4.输入的字符串必须是由3个.划分开的4组整数

5.输入的字符串在转换为数字后,前导不能为0(如001这种情况

6.由3个.划分开的4组整数,每组的数字都必须是位于[0, 255]中的整数

<小知识>

IP地址分为:IPv4 、IPv6

大多数用户熟悉并且流行的IP地址是IPv4,其是用点分四组十进制的表示方法展示的,例如197.101.0.0 等,每一组的数字都是非负的整数,范围在 [0, 255] 之间。IPv4还可以用二进制表示,例如十进制表示的197.101.0.0可以用二进制11000101  01100101  00000000  00000000表示 ,因此也称IPv4是32位的。

IPv6是分块的八组四个十六进制数,例如  5f05:2000:80ad:5800:0058:0800:2023:1d71,中间用:隔开,也可以由二进制表示 同IPv4,由此可看出IPv6是128位的。

import java.util.Scanner;

public class IP {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String ip  = in.nextLine();
        while (!ip.equals("End of file")) {
            if (isIP(ip)) {
                System.out.println("Y");
            } else {
                System.out.println("N");
            }
            ip = in.nextLine();
        }
    }

    public static boolean isIP(String s) {
        //判断输入的字符串是否为空
        if (s == null)
            return false;
        //判断字符串的长度是否在7-15位之间(x.x.x.x-xxx.xxx.xxx.xxx)
        if (s.length() < 7 || s.length() > 15)
            return false;
        //首尾字符判断是否为.(.x.x.x或x.x.x.x.)
        if (s.charAt(0) == '.' || s.charAt(s.length() - 1) == '.')
            return false;
        //通过string.split("\\.")把字符串分割成字符串数组后判断数组长度是否为4
        String[] ss = s.split("\\.");
        if (ss.length != 4)
            return false;
        //判断每个元素的每个字符是否都是数字字符
        for (int i = 0; i < ss.length; i++) {
            for (int j = 0; j < ss[i].length(); j++)
                if (ss[i].charAt(j) < '0' || ss[i].charAt(j) > '9')
                    return false;
        }

        for (int i = 0; i < 4; i++) {
            int temp = Integer.parseInt(ss[i]);
            //用Integer.parseInt(a[i])转换成数字后判断第一个元素是否为0(0.xx.xx.xx不能成立)
            if (i == 0) {
                if (temp == 0)
                    return false;
            }
            //判断每个元素是否在0-255之间
            if (temp < 0 || temp > 255)
                return false;
        }
        return true;
    }

}


结果显示:


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cherry_希.

附gitee源码

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值