IP地址的合法性和子网判断Word文档下载推荐.docx
《IP地址的合法性和子网判断Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《IP地址的合法性和子网判断Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
![IP地址的合法性和子网判断Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-11/23/50601d33-32a3-496c-a62f-bb5b7706326b/50601d33-32a3-496c-a62f-bb5b7706326b1.gif)
for(inti=0;
i<
strlen(c);
i++)
{if(isdigit(c[i])==0&
&
c[i]!
='
.'
)
{cout<
IP地址中含有非法字符!
return;
if(c[i]=='
dotnum++;
//判断IP地址中只能存在3个分隔符
if(dotnum!
=3)
IP地址中分隔符只能为3个!
//判断IP地址中是否存在连续分隔符
for(i=0;
strlen(c)-1;
{if(c[i]=='
&
c[i+1]=='
IP地址中出现连续的分隔符!
}}
//分割IP地址
voidbb(charc[15])
{//判断IP地址中最后不能为分隔符
for(intm=0;
m<
4;
m++)
{ip[m]=0;
intlen;
len=strlen(c);
if(c[len-1]=='
IP地址最后们不能为分隔符!
chartemp[4][15];
for(intj=0;
j<
15;
j++)
temp[i][j]='
\0'
;
intj=0;
i=0;
for(intk=0;
k<
k++)
{if(c[k]!
{temp[i][j]=c[k];
j++;
else
{i++;
j=0;
}}
{//判断每位的长度
len=strlen(temp[i]);
if(len>
3)
IP地址每位长度不能超过3!
switch(len)
{case3:
{while(len!
=0)
{ip[i]+=(temp[i][len-1]-48)*pow(10,3-len);
len--;
break;
case2:
{ip[i]+=(temp[i][len-1]-48)*pow(10,2-len);
default:
{ip[i]+=(temp[i][len-1]-48)*pow(10,1-len);
}}}
longintnum=0;
{//判断每位的大小不超过255
if(ip[i]>
255)
IP地址数字不能超过255!
}
//分割网络地址
voidee(charc[15])
{//判断网络地址中最后不能为分隔符
{subnet[m]=0;
子网号最后们不能为分隔符!
子网号每位长度不能超过3!
{subnet[i]+=(temp[i][len-1]-48)*pow(10,3-len);
{subnet[i]+=(temp[i][len-1]-48)*pow(10,2-len);
{subnet[i]+=(temp[i][len-1]-48)*pow(10,1-len);
}
if(subnet[i]>
子网号数字长度不能超过255!
//生成子网掩码
voidcc()
{cout<
子网掩码为:
intr[32];
num;
{r[i]=1;
32-num;
{r[i++]=0;
intp=0;
intw[8];
intk=0;
{intsum=0;
for(intn=0;
n<
8;
n++)
{w[p]=r[k];
sum=sum+w[p]*pow(2,7-n);
p++;
k++;
p=0;
a[m]=sum;
for(intn=0;
a[n];
if(n!
."
cout<
//判断是否和子网相等
voiddd()
{strings="
{if((a[i]&
ip[i])==subnet[i])
{s=s+"
a"
//如果存在4个a
结果:
if(s=="
aaaa"
属于同一子网!
不属于同一子网!
voidmain()
************IP地址的合法性及子网的判断*************"
设计成员XXXXXX"
charjj='
y'
while(jj!
n'
请输入IP地址:
cin>
>
Ip_addr;
请输入连续1的个数:
请输入子网号:
sub_net;
IP地址为:
Ip_addr[i];
子网号为:
sub_net[j];
aa(Ip_addr);
bb(Ip_addr);
cc();
ee(sub_net);
dd();
是否继续是(其他键)否(n)"
jj;
(2)
题目要求:
编写程序,判断一个IP地址是否合法,并判断该地址是否属于一个给定的子网。
要求:
1)以命令行格式运行:
ip_testsubnet/maskip_addr
其中ip_test为程序名;
subnet为子网号;
mask是一个数值,代表子网掩码连续1的个数;
ip_addr是要测试的ip地址。
例如,要测试的IP地址为202.113.16.10,子网号为202.113.16.0,子网掩码为255.255.255.0
2)判断subnet和ip_addr的合法性(注意考虑全面,比如以下IP均为不合法123..2.1
123.23$.2.1
123.12345.2.1
123.23.45.2.1
3)判断掩码的合法性
4)在IP地址合法的前提下,判断ip_addr是否属于子网subnet
5)输出命令行中的IP是否合法,掩码是否合法(可适当给出不合法原因)以及ip_addr是否属于子网subnet。
我做的程序代码如下:
iostream.h>
string.h>
stdlib.h>
voidsplit(char*addr,int*num)
{//将点分十进制的字符串转换为数值数组
chartemp[4][10];
inti,j,k,len=strlen(addr);
for(j=0;
10;
{temp[i][j]='
k=0;
len;
{if(addr[i]!
{temp[j][k]=addr[i];
{j++;
{num[i]=atoi(temp[i]);
inttoBinary(inta)
{//将十进制数转换为二进制数
if(a/2==0)returna%2;
returna%2+toBinary(a/2)*10;
char*toString(int*a)
{//将二进制的数值数组转换32个字符长的字符指针
char*temp=newchar[33];
inti;
boolflag=false;
char*eight=newchar(),*seven=newchar(),*six=newchar(),*five=newchar(),*four=newchar(),
*three=newchar(),*two=newchar(),*one=newchar();
{itoa(a[i]/10000000,eight,10);
itoa(a[i]/1000000%10,seven,10);
itoa(a[i]/100000%10,six,10);
itoa(a[i]/10000%10,five,10);
itoa(a[i]/1000%10,four,10);
itoa(a[i]/100%10,three,10);
itoa(a[i]/10%10,two,10);
itoa(a[i]%10,one,10);
if(flag==true)
{strcat(temp,eight);
{strcpy(temp,eight);
flag=true;
strcat(temp,seven);
strcat(temp,six);
strcat(temp,five);
strcat(temp,four);
strcat(temp,three);
strcat(temp,two);
strcat(temp,one);
returntemp;
inttest(char*addr)
{//测试IP等点分十进制数的合法性,返回0则不合法,返回1则合法
intlen=strlen(addr);
地址总长超过了15!
return0;
{if((addr[i]<
'
0'
||addr[i]>
9'
)&
addr[i]!
{
地址中包含非法字符!
if(addr[i]=='
if(dotnum>
地址中分隔符只能为3个!
len-1;
{if(addr[i]=='
addr[i+1]=='
地址中不能出现连续的分隔符!
if(addr[len-1]=='
地址最后位不能为分隔符!
inta[4];
split(addr,a);
{if(a[i]>
255||a[i]<
0)
地址数字不在范围0-255之间!
if(a[0]<
1)
地址首位不能为0!
return1;
voidmain(intargc,char*argv[])
{if(argc!
请按以下格式输入命令行:
ip_testsubnet/maskipaddr"
inti,j=0;
char*ipaddr=newchar[strlen(argv[2])];
strcpy(ipaddr,argv[2]);
//字符串格式的IP地址
char*subnet_mask=newchar[strlen(argv[1])];
strcpy(subnet_mask,argv[1]);
char*subnet=newchar[16];
char*mask_num=newchar[4];
intlen=strlen(subnet_mask);
i++)//分离子网号及子网掩码中1的个数
{if(subnet_mask[i]=='
/'
{flag=true;
subnet[j]='
continue;
if(flag==false)
{subnet[j]=subnet_mask[i];
{mask_num[j]=subnet_mask[i];
mask_num[j]='
IP地址测试:
if(test(ipaddr)==1)
ipaddr<
合法"
不合法"
子网号测试:
if(test(subnet)==1)
subnet<
intmaskn=atoi(mask_num);
掩码中1的个数测试:
if(maskn>
0&
maskn<
=32)
个数为:
mask_num<
合法!
不合法!
//将IP地址与子网号转成数值放在数组中
intnbipaddr[4],nbsubnet[4];
split(ipaddr,nbipaddr);
//分离,未转成二进制,只是分离成十进制
split(subnet,nbsubnet);
{nbipaddr[i]=toBinary(nbipaddr[i]);
//将分离出来的十进制转换为二进制
nbsubnet[i]=toBinary(nbsubnet[i]);
char*cbipaddr=newchar[33];
char*cbsubnet=newchar[33];
cbipaddr=toString(nbipaddr);
//将二进制数组转换为32位的二进制字符指针
cbsubnet=toString(nbsubnet);
//测试是否在子网内,是否需转成二进制比较,可用递归转成二进制(除二取余)
maskn;
{if(cbipaddr[i]!
=cbsubnet[i])
IP地址:
不属于"
这一子网"
属于"
对于判断是否属于给定的子网,我采用的方式是将IP地址与子网地址的点分十进制方式都转化为不带分隔符的二进制数,都是32位长,对于给予的子网中1的个数,我只判断其范围,对于其他原因,并示考虑到,希望你看到后,能给予提示,谢谢!