题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 多行注释 ctrl+/
/*char *token
token = strtok(str, "分割符");
while( token != NULL ) {
printf( "%s\n", token );
token = strtok(NULL, "分割符");
}
*/
//原字符串str的改动是分割符原位置均更改为 '\0',内容还在,可以通过逐个字符打印检验。
//但输出 %s str 是第一个子字符串
//理解strtok分成两部分 第一个子字符串 剩余存入NULL 所以会有循环取用
//分割+合格的被存储
//计算坐标
// strtok_r linux平台strtok函数线程安全版。
// windows下的对应安全函数为strtok_s
// ABCDE
// Err
// Priv
// 1.~分割 .分割 子网掩码是否合法
// 2.ip是否合法
// 3.ip范围
//atoi 字符串转数字 注意空字符串和不能转换的会被判为0
//警告:字符串比较要用strcmp 只有单个字符可以用==
//sscanf(str,"%d.%d",&a,&b);
int ip_islegal(int ip[], int n);
int dns_islegal(int dns[], int n);
int main()
{
int A = 0, B = 0, C = 0, D = 0, E = 0, Err = 0, Priv = 0;
int ip[4], dns[4];
memset(ip, -1, 4);
memset(dns, -1, 4);
char str[200];
while (scanf("%s", str) != EOF)
{
memset(ip, -1, 4);
memset(dns, -1, 4);
sscanf(str, "%d.%d.%d.%d~%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3, dns, dns + 1, dns + 2, dns + 3);
if(ip[0]==0 ||ip[0]==127)
continue;
if (dns[3] == -1 || ip_islegal(ip, 4) == 0 || dns_islegal(dns, 4) == 0)
Err++;
else
{
if (ip[0] >= 1 && ip[0] <= 126)
A++;
else if (ip[0] >= 128 && ip[0] <= 191)
B++;
else if (ip[0] >= 192 && ip[0] <= 223)
C++;
else if (ip[0] >= 224 && ip[0] <= 239)
D++;
else if (ip[0] >= 239 && ip[0] <= 255)
E++;
if (ip[0] == 10)
Priv++;
else if (ip[0] == 172)
{
if (ip[1] >= 16 && ip[1] <= 31)
Priv++;
}
else if (ip[0] == 192)
{
if (ip[1] == 168)
Priv++;
}
}
}
printf("%d %d %d %d %d %d %d", A, B, C, D, E, Err, Priv);
return 0;
}
// itoa():
//atoi()
//
int ip_islegal(int ip[], int n)
{
int ret = 1;
for (int i = 0; i < n; i++)
{
if (ip[i] < 0 || ip[i] > 255)
{
ret = 0;
break;
}
}
return ret;
}
int dns_islegal(int dns[], int n)
{
int ret = 1;
int num[9];
memset(num, 0, 9);
if (dns[0] != 255)
ret = 0;
int i = 0; //255个数
int flag = 0; //是否开始出现非零数 所以只能为0
for (int l = 0; ret == 1 && l < n; l++)
{
if (flag==0 && dns[l] == 255)
i++;
else if (flag == 0)
{
flag++;
ret = 0;
for (int j = 128, k = 1; j >= 1; j /= 2, k++)
num[k] = num[k - 1] + j;
for (int j = 0; j < 9; j++)
if (dns[l] == num[j])
{ret = 1;
break;}
}
else
{
if(dns[l]!=0){
ret = 0;
break;
}
}
}
if (i == 4)
{
ret = 0;
}
return ret;
}