解題思路:
這題重頭任務是判斷ip位址和掩碼輸入是否合法,需要檢查:
(1)有無其他字元亂入
(2)"."和"~"的數量和相對位置是否正確
(3)數字的個數及相對位置是否正確
(4)每個數字的範圍是不是在[0,255]
(5)掩碼是否合法(前面是連續的1,然後全是0)
(6)0.0.0.0和255.255.255.255也是非法掩碼
ip和掩碼下輸入合法的情況下,分類就很簡單了。
注意問題:
多種不合法輸入出現,只算一次不合法
移位操作的結果(整型254<<1是508而不是252,因為整型為32位,1的個數沒有減少;char型254<<1是-4而不是252,因為代表有符號數)
難點:邊判斷格式合法否邊提取子段數字
#include #include using namespace std;
int ip[4];
int mask[4];
bool valid(string s)
else
num=stod(subs);
if(num<0 || num>255) //如果子段數字小於0或大於255,位址或掩碼錯誤
return false;
else
} if(i==7)
//判斷掩碼是否合法
i=0;
while(mask[i]==255)
i++;
if(i==4)
return false; 是非法掩碼
int rule=254; //rule是二進位制前面全為1,後面全為0的8bits數
int d=1; //每次為2的次方,使rule實現左移效果
int j;
for(j=0;j<8;j++)
if(j==8)
return false; //掩碼子段不是前面全1,後面全0,掩碼不合法
while(i!=3)
if(mask[0]==0 && i==3)
return false; 是非法掩碼
return true;
}int main()
if(ip[0]>=1 && ip[0]<=126)
else if(ip[0]>=128 && ip[0]<=191)
else if(ip[0]>=192 && ip[0]<=223)
else if(ip[0]>=224 && ip[0]<=239)
dcount++;
else if(ip[0]>=240 && ip[0]<=255)
ecount++;
} cout<
識別有效的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....