识别有效的IP地址和掩码并进行分类统计
题目描述
请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。
所有的IP地址划分为 A,B,C,D,E五类
A类地址1.0.0.0~126.255.255.255;
B类地址128.0.0.0~191.255.255.255;
C类地址192.0.0.0~223.255.255.255;
D类地址224.0.0.0~239.255.255.255;
E类地址240.0.0.0~255.255.255.255
私网IP范围是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
子网掩码为前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
本题暂时默认以0开头的IP地址是合法的,比如0.1.1.2,是合法地址
输入描述:
多行字符串。每行一个IP地址和掩码,用~隔开。
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
输入例子:
10.70.44.68~255.254.255.0 1.0.0.1~255.0.0.0 192.168.0.2~255.255.255.0 19..0.~255.255.255.0
输出例子:
1 0 1 0 0 2 1
思路1:先将ip,mask用"~"分开,在对ip,mask用"."分开,存在4个数组中,并转化为int,
先判断mask是否合法,若合法,再对ip进行分类
import java.util.Scanner; public class Main { private static int a=0; private static int b=0; private static int c=0; private static int d=0; private static int e=0; private static int error=0; private static int p=0; public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()){ String str=sc.nextLine(); String[] array=str.split("~"); String ip=array[0]; String mask=array[1]; getInfo(ip,mask); } // sc.close(); System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+error+" "+p); } public static void getInfo(String ip,String mask){ String[] ipArr=ip.split("\\."); String[] maskArr=mask.split("\\."); if(ipArr.length!=4||maskArr.length!=4){ error++; return; } int[] ipInt=new int[4]; int[] maskInt=new int[4]; for(int i=0;i<4;i++){ if(ipArr[i].equals(" ")||maskArr[i].equals(" ")){ error++; return; } ipInt[i]=Integer.parseInt(ipArr[i]); maskInt[i]=Integer.parseInt(maskArr[i]); if(ipInt[i]>255||maskInt[i]>255){ error++; return; } } if(checkIpMask(ipInt,maskInt)){ int ipInt0=ipInt[0]; int ipInt1=ipInt[1]; if(ipInt0>=1&&ipInt0<=126){ a++; if(ipInt0==10) p++; }else if(ipInt0>=128&&ipInt0<=191){ b++; if(ipInt0==172&&ipInt1>=16&&ipInt1<=31) p++; }else if(ipInt0>=192&&ipInt0<=223){ c++; if(ipInt0==192&&ipInt1==168) p++; }else if(ipInt0>=224&&ipInt0<=239){ d++; }else if(ipInt0>=240&&ipInt0<=255){ e++; } } } public static boolean checkIpMask(int[] ipInt,int[] maskInt){ if(checkMask(maskInt)==false){ error++; return false; } return true; } public static boolean checkMask(int[] maskInt){ String s=""; for(int i=0;i<4;i++){ String str=Integer.toBinaryString(maskInt[i]); int pad=8-str.length(); if(str.length()<8){ for(int j=0;j<pad;j++){ str="0"+str; } } s+=str; } int index=s.indexOf("0"); String temp=s.substring(index+1); if(temp.contains("1")){ return false; }else{ return true; } } }
思路2:分别写判断ip。判断mask,判断私有地址的函数,对字符串处理以后,根据判断函数,计算各个数目
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static boolean judgeIP(String sIP){ Pattern pattern=Pattern.compile("^(\\d{1,})\\.(\\d{1,})\\.(\\d{1,})\\.(\\d{1,})$"); Matcher match=pattern.matcher(sIP); if(match.matches()){ String[] str=sIP.split("\\."); for(String s:str){ int n=Integer.parseInt(s); if(n<0||n>255) return false; } return true; }else return false; } public static boolean judgeMask(String sMask){ String[] str=sMask.split("\\."); StringBuffer sb=new StringBuffer(); for(String s:str){ String temp=Integer.toBinaryString(Integer.parseInt(s)); while(temp.length()!=8){ temp="0"+temp; } sb.append(temp); } String binaryString=sb.toString(); int index0=binaryString.indexOf("0"); if(index0==0) return false; if(binaryString.matches("^1{1,}")) return false; String[] str2=binaryString.split("0"); if(str2.length==1){ return true; } return false; } public static boolean judgePrivateIP(String ip){ String[] str=ip.split("\\."); int A=Integer.parseInt(str[0]); int B=Integer.parseInt(str[1]); int C=Integer.parseInt(str[2]); int D=Integer.parseInt(str[3]); if(A==10) return true; if(A==172){ if(B>=16&&B<=31) return true; } if(A==192&&B==168) return true; return false; } public static void main(String[] args) { int a=0; int b=0; int c=0; int d=0; int e=0; int errorIpMask=0; int privateIp=0; Scanner sc=new Scanner(System.in); while(sc.hasNext()){ String str=sc.next(); String[] s1=str.split("~"); String ip=s1[0]; String mask=s1[1]; if(!judgeIP(ip)||!judgeMask(mask)){ errorIpMask++; continue; } String firstStr=ip.substring(0,ip.indexOf(".")); int num=Integer.parseInt(firstStr); if(num>=1&&num<=126){ a++; }else if(num>=128&&num<=191){ b++; }else if(num>=192&&num<=223){ c++; }else if(num>=224&&num<=239){ d++; }else if(num>=240&&num<=255){ e++; } if(judgePrivateIP(ip)){ privateIp++; } // System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+errorIpMask+" "+privateIp); } sc.close(); System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+errorIpMask+" "+privateIp); } }

浙公网安备 33010602011771号