我有一个程序,它要求用户输入一些IP地址,这些地址将存储在下面的结构体数组中:
struct ipaddr{
int octet1;
int octet2;
int octet3;
int octet4;
}; typedef struct ipaddr ipaddr_t;
struct ipaddr addr_array[];
我需要创建一个函数来检查结构体数组中的所有IP地址,并检查它们是否属于同一个子网(即IP地址的前三个xxx.xxx.xxx是相同的,例如:
123.123.123.1
123.123.123.2
123.123.123.3
然后,对于每个子网,该函数在其自己的行上打印属于该子网的所有IP地址,例如:
123.123.123.1 123.123.123.2 123.123.123.3 123.123.123.4
144.144.144.1 144.144.144.2 144.144.144.3 144.144.144.4
并且打印需要保留用户输入的ip地址的顺序
到目前为止,我只能用以下函数比较两个结构是否具有相同的子网:
int is_same_subnet(ipaddr_t ip1, ipaddr_t ip2){
if(ip1.octet1 == ip2.octet1 &&
ip1.octet2 == ip2.octet2 &&
ip1.octet3 == ip2.octet3){
return 1;
}
else return 0;
}
但是我需要对一个结构体数组这样做(这不起作用,但这是我的尝试):
void print_same_subnet(const ipaddr_t addr_array[], int addr_array_len){
int i, k;
for(i=0; i < addr_array_len; i++){
for(k=1; k < addr_array_len; k++){
if(addr_array[i].octet1 == addr_array[k].octet1 &&
addr_array[i].octet2 == addr_array[k].octet2 &&
addr_array[i].octet3 == addr_array[k].octet3)
{
printf("%i.%i.%i.%i %i.%i.%i.%i \n", addr_array[i].octet1, addr_array[i].octet2, addr_array[i].octet3, addr_array[i].octet4,
addr_array[k].octet1, addr_array[k].octet2, addr_array[k].octet3, addr_array[k].octet4);
}
}
}
}
对于初学者的任何帮助都非常感谢!
3条答案
按热度按时间gz5pxeao1#
jdgnovmf2#
如果您不介意数组被更改,一种方法是对地址进行排序,以便将它们分组在一起,从而可以更容易地作为一个组输出:
r1zk6ea13#
一个简单的方法是构建一个相同大小的辅助数组来记录已经处理了哪些地址。代码可以是(或多或少):