【问题描述】
【问题描述】现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如10.137.17.1,是我们非常熟悉的IP地址,一个地址串中没有空格出现(因为要表示成一个32数字)。>现在需要你用程序来判断IP是否合法。
【输入形式】输入一个ip地址
【输出形式】返回判断的结果YES or NO
【样例输入】
10.138.15.1
【样例输出】
YES
【问题分析】
- 一开始的时候总是C++惯性思维,输入4个整数以及三个字符,判断4个整数是否都在0-255之间,即cin>>A>>c;就是输入一个整数和一个字符’.’,但是在Java中会报错,因为其可能会将192.168.1.25中的192.168看作浮点数,然而用的是接收整数的函数:nextInt()。
- 此处应该用字符串来读取数据,然后利用split函数将其进行劈分成4个子串,将每个子串转为数字,判断其是否在0-255之间。
【代码】
- 错误代码:
import java.util.*;
public class Ex3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int A;
char c;
A=in.nextInt();
if(A<0 || A>255)
{
System.out.println("NO");
return ;
}
for(int i=0;i<3;i++)
{
c=in.next().charAt(0);
A=in.nextInt();
if(A<0 || A>255)
{
System.out.println("NO");
return;
}
}
System.out.println("YES");
}
}
正确代码:
import java.util.*;
public class Ex3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String IP=in.nextLine();
String[] A=IP.split("\\.");
int num;
for(int i=0;i<A.length;i++)
{
num=Integer.valueOf(A[i]);
if(num<0||num>255)
{
System.out.println("NO");
return;
}
}
System.out.println("YES");
}
}
【学习】
数字与字符串转换:
- 数字转字符串:str=String.valueOf(12);
- 字符串转数字:num=Integer.valueOf(“12”);
字符串劈分函数split的用法:
- split有两种定义方式:
- split(String regex):String[]-string,其中regex是要分隔的字符。
String[] str1=str.split(",");
- split(String regex,int limit):String[]-string,其中regex是分隔符,limit是要限制分隔后的数量。这两点都与Python中的split函数类似。
- 对于特殊字符: | ^ $ * . ( ) \ / ,必须在前面加上\进行转义。注意\要用三个\,也就是其必须写成split("\\\\");
- 逐个分隔字符串:split("");里面是空,而不是空格,其会将字符串分割为许多只含一个字符的子串。
- 同时使用多个分隔符进行分隔。split("[分隔符分隔符]"),这里只要碰到[]中的任何一个分隔符都会进行字符串分隔。
- 用多个空格分隔符进行分隔。split("{1,}");就是用一个或者以上的空格进行分隔,split("{2,}");即用两个或者以上的空格进行分隔。
【参考链接】
https://jingyan.baidu.com/article/9989c746c5d707f648ecfe05.html