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轉換為二進位制,並以字串形式儲存...