識別有效的IP位址和掩碼並進行分類統計

2021-07-11 00:10:20 字數 2852 閱讀 7515

標籤(空格分隔): oj_演算法

請解析ip位址和對應的掩碼,進行分類識別。要求按照a/b/c/d/e類位址歸類,不合法的位址和掩碼單獨歸類。

所有的ip位址劃分為 a,b,c,d,e五類

a類位址1.0.0.0~126.255.255.255;

b類位址128.0.0.0~191.255.255.255;

c類位址192.0.0.0~223.255.255.255;

d類位址224.0.0.0~239.255.255.255;

e類位址240.0.0.0~255.255.255.255

私網ip範圍是:

10.0.0.0~10.255.255.255

172.16.0.0~172.31.255.255

192.168.0.0~192.168.255.255

子網掩碼為前面是連續的1,然後全是0

10.70.44.68~255.254.255.0

1.0.0.1~255.0.0.0

192.168.0.2~255.255.255.0

19..0.~255.255.255.0

1.0.0.1~255.0.0.0 —-a類

192.168.0.2~255.255.255.0 —-c類,私有

10.70.44.68~255.254.255.0—-錯誤的掩碼

19..0.~255.255.255.0—–錯誤的ip

可以得到統計資料如下:

1 0 1 0 0 2 1

huawei_test.cpp : 定義控制台應用程式的入口點。

#include

#include

#include

#define n 50

int convertsubiptoint(const

char* sub_ip)

return sub_value;

}bool isipaddressvalid(const

char* pszipaddr, int *subipvalue)

//去除後邊空格

while (pszipaddr[index_end] == ' ')

if (index_end <= index_start)

return

false;

int ip_length = index_end - index_start + 2;

char *temp_ip=(char*)malloc(ip_length);

strncpy(temp_ip, pszipaddr + index_start, ip_length-1);

temp_ip[ip_length - 1] = '\0';

char* sub_ip = strtok(temp_ip, ".");

int sub_ip_count = 0;

while (sub_ip != null)//ip分段,計數分段ip,並轉換為0-255

subipvalue[sub_ip_count - 1] = convertsubiptoint(sub_ip);

if (subipvalue[sub_ip_count - 1] < 0 || subipvalue[sub_ip_count - 1] > 255)

sub_ip = strtok(null, ".");

}free(temp_ip);

if (sub_ip_count != 4)

return

false;

else

return

true;

}bool isvalidmask(int* mask_value)

mask_int32 = ~mask_int32 + 1;

if ((mask_int32 & (mask_int32 - 1)) == 0)//判斷是否w為2^n次方

return

true;

else

return

false;

}bool isprivateip(int*ip_value)

bool ipanalyse(char* str, int* result)

if (!isvalidmask(sub_mask_value))

if (isprivateip(sub_ip_value))

result[6]++;

if (sub_ip_value[0] >= 1 && sub_ip_value[0] <= 126)//a類

if (sub_ip_value[0] >= 128 && sub_ip_value[0] <= 191)//b類

if (sub_ip_value[0] >= 192 && sub_ip_value[0] <= 223)//c類

if (sub_ip_value[0] >= 224 && sub_ip_value[0] <= 239)//d類

if (sub_ip_value[0] >= 240)//e類

return

false;

}int main()

; while (fgets(str, sizeof(str), stdin) != null)

for (size_t i = 0; i < 7; i++)

return

0;}

重點: 判斷子網掩碼的方法

下面給的例子是這樣的:先驗證是否為合法ip,然後將掩碼轉化成32無符號整型,取反為000…00111…1,然後再加1為00…01000…0,此時為2^n,如果滿足就為合法掩碼。

int issubnetmask(char* subnet)  

return

0;

參見:

識別有效的IP位址和掩碼並進行分類

請解析ip位址和對應的掩碼,進行分類識別。要求按照a b c d e類位址歸類,不合法的位址和掩碼單獨歸類。所有的ip位址劃分為 a,b,c,d,e五類 a類位址1.0.0.0 126.255.255.255 b類位址128.0.0.0 191.255.255.255 c類位址192.0.0.0 2...

識別有效的IP位址和掩碼並進行分類統計

include include include include using namespace std static int result 7 儲存最後結果的陣列 string chang string str 轉換為二進位制 itoa num,tmp1,2 把num轉換為二進位制,並以字串形式儲存...

識別有效的IP位址和掩碼並進行分類統計

描述 請解析ip位址和對應的掩碼,進行分類識別。要求按照a b c d e類位址歸類,不合法的位址和掩碼單獨歸類。所有的ip位址劃分為 a,b,c,d,e五類 a類位址1.0.0.0 126.255.255.255 b類位址128.0.0.0 191.255.255.255 c類位址192.0.0....