题目描述
话说上次猴哥做梦梦到Z老师,Z老师紧接着就被来考查的专家抽中了说课,让Z老师好一顿忙活…
本来以为这只是个巧合,谁成想前几天猴哥又梦到了Z老师,这下可更坏了,Z老师实验室的路由器全瘫痪了.Z老师不干了,非让猴哥给他修路由器,机智的猴哥马上就诊断出是路由器的程序出了问题,可是他眼下要为学弟们准备假期计划,近几天抽不出时间重写路由器的程序。于是猴哥就发了email向你求助,并承诺搞定了这件大事就请你吃大餐~
猴哥的email:(客套话省略2000字)…路由器中有一张路由表,表中是目的网络,子网掩码(如255.255.255.0),下一跳地址三项,给路由器发过来一个IP地址,如10.10.46.8,此IP地址的二进制形式(用“.”分隔的每一个十进制数转换为一个八位二进制数)为:00001010 00001010 00101110 00001000 ,用二进制的IP和二进制的子网掩码相与,得到的结果按每八位转换回十进制,就是IP对应的目的网络地址。请编程求给定IP与子网掩码对应的目的网络地址。
举个例子: IP: 00001010 00001010 00101110 00001000
子网掩码: 11111111 11111111 11111111 00000000
== : 00001010 00001010 00101110 00000000
十进制表示: 10 10 46 0
只修提交需要修改部分的代码,猴哥在此谢过~
#include <stdio.h>
unsigned char andoper(unsigned char c1,unsigned char c2)
{
return c1&c2;
}
int main()
{
int i,j,N,num;
unsigned char ipaddr[4],netmask[4],netaddr[4];
scanf("%d",&N);
for(i=0; i<N; i++)
{
for(j=0; j<4; j++)
{
scanf("%d",&num);
ipaddr[j]=num;
}
for(j=0; j<4; j++)
{
scanf("%d",&num);
netmask[j]=num;
}
/*****修改的起始行******/
for(j=0; j<4; j++)
netaddr[i] = andoper(ipaddr[j],netmask[j]);
for(j=0; j<3; i++)
printf("%d.",netaddr[j]);
printf("%d\n",netaddr[j]);
/*****修改的终止行*****/
}
return 0;
}
输入
首先输入一个数字N,代表用例的个数(n<100),接下来输入样例中第一行为四个十进制数(<=255)代表IP地址,第二行为四个十进制数(<=255)代表子网掩码,十进制数用空格分隔。
输出
输出用“.”分隔的十进制目的网络(如10.10.46.0)
样例输入
2
128 96 39 10
255 255 255 128
128 96 40 12
255 255 255 128
样例输出
128.96.39.0
128.96.40.0
参考代码
#include <stdio.h>
unsigned char andoper(unsigned char c1,unsigned char c2)
{
return c1&c2;
}
int main()
{
int i,j,N,num;
unsigned char ipaddr[4],netmask[4],netaddr[4];
scanf("%d",&N);
for (i=0; i<N; i++)
{
for (j=0; j<4; j++)
{
scanf("%d",&num);
ipaddr[j]=num;
}
for (j=0; j<4; j++)
{
scanf("%d",&num);
netmask[j]=num;
}
for (j=0; j<4; j++)
netaddr[j] = andoper(ipaddr[j],netmask[j]);
for (j=0; j<3; j++)
printf("%d.",netaddr[j]);
printf("%dn",netaddr[j]);
}
return 0;
}
解析
暂无