题目描述
在基于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;
}
}
结果显示: