题目描述

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

 
子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)

输入描述:

多行字符串。每行一个IP地址和掩码,用~隔开。

输出描述:

统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。

示例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
参考讨论;子网掩码这块不是很熟悉,感觉没有特别好的算法,看起来都有点暴力
链接:https://www.nowcoder.com/questionTerminal/de538edd6f7e4bc3a5689723a7435682?f=discussion
来源:牛客网
20

Yac836【作者】

这个问题注意一下几点

  1. 255.255.255.255 为非法子网掩码(题目的意思,实际这个掩码,也能用)
  2. 当子网掩码错误时,不在判断ip是否有效,错误直接加一, 进行下次循环
  3. 当一个ip属于ABCDE类中的一个时候,也属于私有ip时,私有ip和他属于的分类都应该加一

解题的方法

  1. 判断子网掩码是否有效

    1. 通过判断是否为255.255.255.255 如果是的话,错误加一,继续下次循环
    2. 判断别的子网掩码是否正确。根据子网掩码二进制规律(开头为连续的1,然后为0),我们将子网掩码按位取反,然后加一,得到的新二进制位,然后我们通过判断二进制中1的个数来判断是否为合法的子网掩码。(因为合法的子网掩码,按位取反,加一后,二进制位中,只有一个1)
      int validMask(char *p) {
      int flag,i ;
      unsigned int b1 = 0, n[4];
      sscanf(p, "%u.%u.%u.%u", &n[3], &n[2], &n[1], &n[0]);
      if(n[0] == 255 &&n[1] == 255 &&n[2] == 255 &&n[3] == 255 ) {
      flag = false;
      return flag;
      }
      for(i = 0; i < 4; ++i)
      b1 += n[i] << (i * 8);
      b1 = ~b1 + 1;
      if((b1 & (b1 - 1)) == 0) {
      flag = true;
      } else
      flag = false;
      return flag;
      }
  2. 判断ip时候有效,我们可以通过网络编程中自带的函数进行判断

    #include <arpa/inet.h>
    int inet_pton(int family, const char *strptr, void *addrptr);
    返回:若成功则为1,若输入不是有效的表达格式则为0,若出错则为-1
  3. 如果ip地址有效,我们就可以判断它属于哪一类,是否是私有ip
  4. 完整代码

#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <stdlib.h>
#include <string.h>
#define true 1
#define false 0
int validMask(char *p) {
int flag,i ;
unsigned int b1 = 0, n[4];
sscanf(p, "%u.%u.%u.%u", &n[3], &n[2], &n[1], &n[0]);
if(n[0] == 255 &&n[1] == 255 &&n[2] == 255 &&n[3] == 255 ) {
flag = false;
return flag;
}
for(i = 0; i < 4; ++i)
b1 += n[i] << (i * 8);
b1 = ~b1 + 1;
if((b1 & (b1 - 1)) == 0) {
flag = true;
} else
flag = false;
return flag;
}
int main() {
char str[50];
int a =0, b = 0, c = 0, d = 0, e = 0, err = 0, pri = 0;
while(fgets(str,50,stdin)) {
char *tok = str;
char p[2][20] = {0};
int i = 0;
while ((tok = strtok(tok, "~")) != NULL) {
strcpy(p[i], tok);
tok = NULL;
i ++ ;
if(i == 2)
i = 0;
}
int flag = validMask(p[1]);
if(flag) {
struct in_addr s;
unsigned int ip1,ip2;
int valid = inet_pton(AF_INET,p[0],(void *)&s);
sscanf(p[0],"%u.%u",&ip1,&ip2);
if(valid) {
if(ip1>=1 && ip1 <=126)
a++;
else if(ip1>=128 && ip1 <=191)
b++;
else if(ip1>=192 && ip1 <=223)
c++;
else if(ip1>=224 && ip1 <=239)
d++;
else if(ip1>=240 && ip1 <=255)
e++;
if(ip1==10
|| (ip1==172 && ip2 >=16 &&ip2 <=31)
|| (ip1==192 && ip2 ==168))
pri ++;
} else
err ++;
} else
err++;
}
printf("%d %d %d %d %d %d %d\n",a,b,c,d,e,err,pri);
return 0;
} C里面net去解,想法很不错,不熟悉仅做参考学习。

算法 识别有效ip地址和掩码并做统计的更多相关文章

  1. 26:IPMaskCheck识别有效的ip地址和掩码并分类统计

    题目描述 请解析IP地址和对应的掩码,进行分类识别.要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类. 所有的IP地址划分为 A,B,C,D,E五类 A类地址1.0.0.0~126.2 ...

  2. Python 输入IP地址及掩码告诉你该网段包含的全部地址(IPy模块练习)

    IPy模块原本使用时需要输入正确的网络位和掩码,我利用处理报错的机制实现了输入任意IP地址和掩码均可正确输出结果的小程序. #!/usr/bin/env python # -*- coding: ut ...

  3. 根据Ip地址与掩码 得出 子网地址与广播地址

    由于给予条件优先,没有直接给出子网地址与广播地址.但是又需要这两个参数,需要我们使用ip 地址与 子网掩码得出子网地址与广播地址.思路如下:       1. 子网地址, ip地址与 子网掩码分别换算 ...

  4. 设置ip地址、掩码、网关、DNS

    @echo offcolor f8mode con cols=40 lines=8echo.echo.echo      设置IP为:echo.set /p ip=              192. ...

  5. 识别有效的IP地址和掩码并进行分类统计

    该题我的想法是把每一个ip看出一个整数,将读取得到的数据一一与给定的ip范围比较即可.另外本题应该注意的地方是scanf读取俩字符串的方法. 代码如下: #include<stdio.h> ...

  6. 识别有效的IP地址和掩码并进行分类统

    #include<iostream> #include<stdio.h> #include<string.h> using namespace std; int c ...

  7. IP地址分类与识别错误

    //描述:  请解析IP地址和对应的掩码,进行分类识别.要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类. //所有的IP地址划分为 A,B,C,D,E五类 //A类地址1.0.0.0 ...

  8. 【Linux网络基础】网络子网划分基础知识(IP地址,子网)

    一. IP地址分类与子网划分基础 1. 什么是IP地址? 常见的ip地址版本为ipv4, ipv6 32位 4 * 8=32位. 32位二进制数字序列组成的数字序列   点分十进制 采用点将32位数字 ...

  9. IP地址、子网掩码详解

    如何通过子网掩码划分网段 资料一: 一.缺省A.B.C类地址,子网掩码:  二.子网掩码的作用:  code:  IP地址 192.20.15.5 11000000 00010100 00001111 ...

随机推荐

  1. 获取系统的documents路径

    获取路径 https://superuser.com/questions/1132288/windows-command-prompt-get-relocated-users-documents-fo ...

  2. zabbix 接入钉钉机器人报警

    import requests import json import sys import os headers = {'Content-Type': 'application/json;charse ...

  3. PHP-执行外部程序

    备份 / 恢复数据库 exec - 执行一个外部程序(在 php 文件所在目录进行执行) 很久以前写的,很多方法是项目中的直接复制粘体用不了,只能提供下思路. 用到执行外部程序的就这一句: exec( ...

  4. Jmeter 循环控制器 遍历结果

    1.测试计划,添加Mysql jar包 2.线程组 3.JDBC Connection Configuration,配置Mysql 4.添加JDBC Request,将查询出的数据对应的存入usern ...

  5. 【SD系列】SAP 跨年时更改销售凭证号码段

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP 跨年时更改销售凭证号码段   ...

  6. 舔狗【2019河北省大学生程序设计竞赛 J题】

    题目描述 > “舔狗舔狗,> 舔到最后,> 一无所有.” 有 n 只舔狗,每只舔狗的心中都有自己朝思暮想的一位. 每个人虽然受到了一万次拒绝,还毅然第一万零一次鼓起勇气. 作为一个不 ...

  7. Support Vector Machine(3):Soft Margin 平衡之美

    很多材料上面讲道“引入Soft Margin的原因是因为数据线性不可分”,个人认为有些错误,其实再难以被分解的数据,如果我们用很复杂的弯弯绕曲线去做,还是可以被分解,并且映射到高维空间后认为其线性可分 ...

  8. Emqtt集群搭建

    1 Emqtt简单搭建 1.1  介绍:EMQ:EMQ 2.0,号称百万级开源MQTT消息服务器,基于Erlang/OTP语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源MQTT消息服务器 ...

  9. Chrome打开标签页预览

    类似于Microsoft Edge浏览器上的标签页缩略图预览非常方便,其实现在谷歌浏览器正在测试相关的功能,如果想提前体验,就在地址栏输入"chrome://flags"并按下回车 ...

  10. Java 遍历某个目录

    import java.io.File; import java.io.IOException; public class DirErgodic { public static void find(S ...