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

2021-07-25 07:26:51 字數 3570 閱讀 4489

talk is cheap, show me the code.

請解析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

輸入描述:

多行字串。每行乙個ip位址和掩碼,用~隔開。

輸出描述:

統計a、b、c、d、e、錯誤ip位址或錯誤掩碼、私有ip的個數,之間以空格隔開。

輸入例子:

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 1 0 0 2 1
題目有些地方沒有講清楚,害我花了很多時間去揣摩意思。首先要確定ip以0開頭和以127開頭都是正確的輸入,不過不屬於任何一類而已,然後判斷掩碼正確與否時除了必須1都在0前面,還要注意255.255.255.255是錯誤的掩碼。另外還要注意私網ip其實也是abcde類中某一類,兩類都要加一。

解題方式1:

全部**按邏輯來,不投機取巧。

#include #include #include #include using namespace std;

int main()

, code[4] = ;

string line;

while (cin >> line)

else else }}

if (i != 4)

else

getline(is, codestr, '~');

istringstream is2(codestr);

string s1;

int j = 0;

while (getline(is2, s1, '.'))

else

}for (int i = t - 1; i >= 0; i--)

}if (temp == -1)

break;

else }}

}if (j != 4)

else

for (int i = j + 1; i < 4; i++)

}if (j == -1 || code[3] == 255)

else

}if (ipflag && codeflag)

else if (ip[0] >= 128 && ip[0] <= 191) else if (ip[0] >= 192 && ip[0] <= 223) else if (ip[0] >= 224 && ip[0] <= 239) else if (ip[0] >= 240 && ip[0] <= 255) }}

cout << anum << " " << bnum << " " << cnum << " " << dnum << " " << enum << " " << errnum << " " << prinum << endl;

return 0;

}

雖然全部邏輯實現,但是邏輯不算直觀,思路是先判斷輸入的ip是否有效,有效則儲存在ip陣列中,然後判斷掩碼每個數字是不是符合規範的,每個數字都符合規範就把掩碼都儲存在code陣列中,再判斷整個32位掩碼是不是符合規範的,這裡特別要注意出去255.255.255.255的情況,如果ip和掩碼都符合規範,再進行分類,同時屬於私網和公網某類的兩類都需要計數加一。

解題方式2:

下面這種方式判斷掩碼是否正確是通過列舉出8位的所有可能值一次判斷的,雖然很直觀,但不是很滿意。

#include#include#include#includeusing namespace std;

int stringtoint(string str)

vectortoint(string str)

else

}else

else}}

}else

else

}}

}else

}else

}return false;

}int main()

i++;

for(;i=0&&ip[1]<=255&&ip[2]>=0&&ip[2]<=255&&ip[3]>=0&&ip[3]<=255)

else if(ip[0]>=128&&ip[0]<=191)

else if(ip[0]>=192&&ip[0]<=223)

else if(ip[0]>=224&&ip[0]<=239)

else if(ip[0]>=240&&ip[0]<=255) } }

else

}cout<解題方式3:

這種方式分層比較清晰,雖然也是通過列舉法來判斷掩碼,但是**可讀性最強。

#include#include#includeusing namespace std;

void split(string& str, vector& strs)

strs.push_back(str);

}bool checknum(string& str)

int num=atoi(str.c_str());

if(num>=0 && num<=255)

return true;

return false;

}bool checkip(vector& segs)

//if(atoi(segs[0])==127)

// return false;

return true;

}bool checkmask(vector& segs)else if(n1>=128 && n1<=191)else if(n1>=192 && n1<=223)else if(n1>=224 && n1<=239)

counter[3]++;

else if(n1>=240 && n1<=255)

counter[4]++;

}int main()

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...

18 識別有效的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....

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

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