描述 | |
---|---|
知识点 | 字符串,循环,查找,搜索,排序,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归 |
运行时间限制 | 0M |
内存限制 | 0 |
输入 | 多行字符串。每行一个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 |
输出 | 统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开,根据上面的IP,可以得到:
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 |
样例输入 | 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地址及掩码,然后逐行按‘.’(点)把字符串变成数字放进数组,通过判断IP地址及掩码的数值个数及范围判断其有效性;(笨方法,仅是一种思路,用正则表达式会简单很多)
代码如下:
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
bool isIP(vector<char> &a,vector<int> &b){
int i = 0,temp = 0,pre = 0;
while(a[i] !='~'){
if(a[i] == '.'){
int now = i-1,ol = 1;
if(a[pre] == '.'){
i++;
continue;
}
while(now >= pre){
temp += (a[now] - '0')*ol;
now--;
ol *= 10;
}
b.push_back(temp);
temp = 0;
pre = i+1;
i++;
}else
i++;
}
int now = i-1,ol = 1;
while(now >= pre){
temp += (a[now]-'0')*ol;
now--;
ol *= 10;
}
b.push_back(temp);
int len = b.size();
//cout << len;
if(len == 4){
for(int j = 0;j < 4;j++){
//cout << b[j];
if(b[j] >= 0 && b[j] <= 255)
continue;
else
return false;
}
return true;
}else
return false;
}
bool isMesk(vector<char> &a){
vector<int> b;
b.clear();
int i = 0,temp = 0,pre;
while(a[i] != '~')
i++;
pre = i+1;
while(a[i] !='\0'){
if(a[i] == '.'){
int now = i-1,ol = 1;
while(now >= pre){
temp += (a[now] - '0')*ol;
now--;
ol *= 10;
}
b.push_back(temp);
temp = 0;
pre = i+1;
i++;
}else
i++;
}
int now = i-1,ol = 1;
temp = 0;
while(now >= pre){
temp += (a[now]-'0')*ol;
now--;
ol *= 10;
}
b.push_back(temp);
int len = b.size();
if(len == 4){
for(int m = 0;m < 3;m++){
// cout << b[m] << " ";
if(b[m] == b[m+1] && (b[m] == 255 || b[m] == 0))
continue;
else if(b[m] > b[m+1])
continue;
else
return false;
cout << b[m] << " ";
}
for(int j = 0;j < 4;j++){
if(b[j] == 255 || b[j] == 254 || b[j] == 252 || b[j] == 248 ||
b[j] == 240 || b[j] == 224 || b[j] == 192 || b[j] == 128 || b[j] == 0)
continue;
else
return false;
}
return true;
}else
return false;
}
bool isnumber(char c){
if(c >= '0' && c <= '9')
return true;
else
return false;
}
int main()
{
int a_back = 0,b_back = 0,c_back = 0,d_back = 0,e_back = 0,si_back = 0,err_back = 0;
char a[20][70];
int i = 0;
while(cin.getline(a[i],70,'\n') && a[i][0] != '\0'){
i++;
}
for(int j = 0;j < i;j++){
vector<char> v;
vector<int> b;
int len = strlen(a[j]);
for(int m = 0;m < len;m++){
v.push_back(a[j][m]);
}
v.push_back('\0');
bool isip = isIP(v,b),ismask = isMesk(v);
if(isip && ismask){
if(b[0] >= 1 && b[0] < 128)
a_back++;
if(b[0] >= 128 && b[0] < 192)
b_back++;
if(b[0] >= 192 && b[0] < 224)
c_back++;
if(b[0] >= 224 && b[0] < 240)
d_back++;
if(b[0] >= 240 && b[0] < 256)
e_back++;
if((b[0] == 10) || (b[0] == 127 && b[1] >= 16 && b[1] <= 31) || (b[0] ==192 && b[1] == 168))
si_back++;
}
else
err_back++;
}
cout << a_back << " " << b_back << " " << c_back << " "
<< d_back << " " << e_back << " " << err_back << " "
<< si_back <<endl;
}