IP地址的表示一般为A.B.C.D,一共四个数字和三个点号,其中ABCD都是0~255之间的数字。
1、要求判断一个字符串是不是合法的IP地址。
这个字符串的长度应该大于等于7,小于等于15。字符串必须要能分成四部分,而且每部分都是数字字符,分隔符号是点号。以下是自己的代码:
#include <iostream>
#include <string>
using namespace std;
bool judge(string s)
{
if(s.length()<7||s.length()>15) return false;//满足ip地址的字符个数限制
int num=0,count=0,a[5]={-1,-1,-1,-1,-1};
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9') num=num*10+s[i]-'0';//如果是数字就保存到num
else if(s[i]=='.'){//如果遇到点号说明一段数字已经转换完成
count++;
a[count]=num;
num=0;//num要重新置零,计算下一个数
}
else return false;
}
a[++count]=num;//最后一个数段没有点号分割,别忘记了存储这个数
for(int i=1;i<5;i++){
if(a[i]<0||a[i]>255) return false;//如果没有4个数字,那他就是-1,不合法;如果数字大于255也是不合法的
}
return true;
}
int main()
{
string s1;
cin>>s1;
cout<<boolalpha<<judge(s1)<<endl;
system("pause");
return 0;
}
2、子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。
* 功能: 判断两台计算机IP地址是同一子网络。
* 输入参数: String Mask: 子网掩码,格式:“255.255.255.0”;
* String ip1: 计算机1的IP地址,格式:“192.168.0.254”;
* String ip2: 计算机2的IP地址,格式:“192.168.0.1”;
*
* 返回值: 0:IP1与IP2属于同一子网络; 1:IP地址或子网掩码格式非法; 2:IP1与IP2不属于同一子网络
代码如下:
#include <iostream>
#include <string>
using namespace std;
bool judge(string s,int a[])
{
if(s.length()<3||s.length()>15) return false;//这里的子网掩码测试用例中有255.0这种样式,所以字符串长度就没有要求必须大于等于7了
int num=0,count=0;
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9') num=num*10+s[i]-'0';
else if(s[i]=='.'){
count++;
a[count]=num;
num=0;
}
else return false;
}
a[++count]=num;
for(int i=1;i<5;i++){
if(a[i]<0||a[i]>255) return false;
}
return true;
}
bool compa(int a1[],int a2[]){
for(int i=1;i<5;i++){
if(a1[i]!=a2[i]) return false;
}
return true;
}
int main()
{
string s1,s2,s3;
int a1[5]={0},a2[5]={0},a3[5]={0};
while( cin>>s1>>s2>>s3)
{
if((judge(s1,a1)&&judge(s2,a2))&&judge(s3,a3)){//判断子网掩码和ip地址的合法性,并把ip地址转换成几个数据段
for(int i=1;i<5;i++){
a2[i]=a2[i]&a1[i];//第一个ip与子网掩码相与
a3[i]=a3[i]&a1[i];//第二个ip与子网掩码相与
}
if(compa(a2,a3)) cout<<"0"<<endl;//如果相与之后,四个数字同,就说明他们属于同一个子网,输出0
else cout<<"2"<<endl;//不属于同一个子网
}
else cout<<"1"<<endl;//子网掩码或者ip地址不合法
}
return 0;
}
3、给一个字符串,能分割出多少个有效的IP地址,比如输入“255172123”,可以分割成“255.17.21.23”、“255.17.2.123”、“255.17.212.3”、“255.172.12.3”、“255.172.1.23”等等……这个还没想出来~~~~