华为机试HJ18 识别有效的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到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就是一个非法的掩码)

(注意二进制下全是1或者全是0均为非法子网掩码)

注意:

1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略

2. 私有IP地址和A,B,C,D,E类地址是不冲突的

输入描述:

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

请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。

输出描述:

统计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

说明:

10.70.44.68~255.254.255.0的子网掩码非法,19..0.~255.255.255.0的IP地址非法,所以错误IP地址或错误掩码的计数为2;
1.0.0.1~255.0.0.0是无误的A类地址;
192.168.0.2~255.255.255.0是无误的C类地址且是私有IP;
所以最终的结果为1 0 1 0 0 2 1        

示例2

输入:

0.201.56.50~255.255.111.255
127.201.56.50~255.255.111.255

输出:

0 0 0 0 0 0 0

说明:

类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略        

一、问题分析

1.解析IP地址和对应的掩码,进行分类识别。

2.按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。

3.一共有五类IP地址

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

4.子网掩码为二进制下前面是连续的1,然后全是0。

举例说明255.255.255.32是一个非法的掩码

因为它的二进制是11111111.11111111.1111111.00100000

不是全都连续

5.题目还提及了二进制下全是1或者全是0均为非法子网掩码

也就是说255.255.255.255和0.0.0.0是非法子网掩码

6.提及了两个注意的点

①类似于0.*.*.*和127.*.*.*的IP地址不属于上述输入的任何一类,也不属于不合法ip地址,计数时忽略

②私有IP地址和A,B,C,D,E类地址是不冲突的(也就是说一个地址他可以是A类私有也可是是A类公有)

7.输入描述:多行字符串,每行一个IP地址和掩码,用~隔开。

还提及了请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。

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

9.通过读题我们的到题目大概的意思是输入一些IP和掩码,让我们来统计这些

IP和掩码的组合中A类地址,B类地址,C类地址,D类地址,E类地址,

错误的IP地址或错误掩码

以及私有的IP的个数

这些数字之间以空格隔开

10.我们来看一下示例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
这个输入输入了四条IP和掩码组合

第一条是A类地址,但是掩码前面的部分不是连续的1,所以这是一个不合法的掩码(单独归类)

第二条是一个A类地址,且掩码前面8位都是1,所以是一个合法的A类地址,但他不是一个A类私有地址
第三条是一个C类地址,他的前24位掩码都是1,所以是一个合法的C类地址,而且他还是一个C类私有地址

第四条IP地址是错误的,所以计入错误IP地址或错误掩码

所以我们有1个A类地址,0个B类地址,1个C类地址,0个D类地址,0个E类地址,2个错误IP地址或错误掩码,1个私有IP

所以我们输出1 0 1 0 0 2 1

再来看一下示例2

0.201.56.50~255.255.111.255
127.201.56.50~255.255.111.255
第一条符合0.*.*.*它不属于任何一类,也不属于不合法ip地址,所以清零

第二条符合127.*.*.*也不属于任何一类,所以清零

所以我们输出0 0 0 0 0 0 0

二、解题思路

1.首先我们需要定义一个s用来读取每一行的数据

每行的数据应该不超过

(3个数字*4组+4个点)*2 + 1个“~”符号 = 33个字符

2. 我们定义a,b,c,d,e用来存放这五类地址的个数,然后我们定义一个error来存放错误IP地址或错误掩码的个数,然后我们定义一个private存放私有IP的个数

3.我们逐行读取数据,并用strtok分割字符串,“~”左边的是IP,“~”右边的是子网掩码

4.我们将~左边的IP储存为char *ip,将~右边的子网掩码储存为char *subnetmask

5.首先我们对子网掩码进行判断

使用sscan将子网掩码分成四个部分,sscan(subnetmask,“%d.%d.%d.%d", &s1, &s2, &s3, &s4)读取到四个整数变量中s1,s2,s3,s4

sscan它的作用类似于scanf函数,但是sscanf是从给定的字符串str中读取数据,而scanf是从标准输入(通常是键盘)读取数据。

如果s1、s2、s3、s4全都是0或者全都是255那么证明这个子网掩码是错误的,我们不需要再检查ip地址了直接error++

如果s1、s2、s3、s4大于等于0小于等于255,那么我们开始检查他的前面是否全都是1,后面是否全都是0

(如果s1-4中任何一个部分小于0或者大于255那么也是错误掩码error++)

6.如果我们判断好子网掩码是正确的了,那么我们判断IP地址(否则直接error++不用判断IP)

同样用sscan,将ip地址分成四个部分,sscan(s,“%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4)读取到四个整数变量中ip1,ip2,ip3,ip4

首先我们判断ip1是否是0或者127,如果ip1等于0或者127那么我们直接continue,进入下一次循环(读取下一行数据)

然后我们判断ip1、ip2、ip3、ip4是否全都是大于0小于256,如果是的话我们接着判断(如果不是的话我们error++)

先判断ip地址属于五类ip中的哪一类,判断ip1是属于1-126,128-191,192-223,224-239,240-255哪一个部分,然后分别对应部分的字母++

比如ip1>=1 && ip1<= 126的情况下我们a++

然后我们在a类的情况中还需要判断ip1是否等于10,如果是我们private++

在b类的情况中我们判断ip1是否等于172,如果是我们再判断ip2是否大于等于16小于等于31如果是,我们private++

在c类的情况中我们判断ip1是否是192,如果是我们再判断ip2是否是168,如果是我们private++

7.然后打印我们的a,b,c,d,e,error,private.(以空格隔开)

三、具体步骤

使用的语言是C

1.我们#include <stdio.h>引入输入输出库可以调用scanf、sscanf和printf函数

2.我们#include <string.h>库可以使用strtok函数,分割我们的字符串

3.我们进入主程序int main()

4.我们char s[33];

5.我们将计数器初始化

int a = 0;

int b = 0;

int c = 0;

int d = 0;

int e = 0;

int error = 0;

int private = 0;

6.逐行扫描进来输入直到没有数据

while(scanf("%32s", s) != EOF)

7.读入ip和subnetmask

char *ip = strtok(s, "~");

char *subnetmask = strtok(NULL, "~");

然后我们对子网掩码进行判断,先将其四个部分分别取出

unsigned int s1, s2, s3, s4;

sscan(subnetmask,“%d.%d.%d.%d", &s1, &s2, &s3, &s4);

我们定义一个notValid = 0;用来记录如果子网掩码不合法的话就跳过ip地址检查

如果是全0或者全1的情况我们记录非法

if((s1 == 0 && s2 == 0 && s3 == 0 && s4 == 0) || (s1 == 255 && s2 == 255 && s3 == 255 && s4 == 255))

error++;

notValid = 1;

检查合法性

else if(s1 >= 0 && s1 <= 255 && s2 >= 0 && s2 <= 255 && s3 >= 0 && s3 <= 255 && s4 >=0 && s4 <= 255) 

如果合法,从第一位二进制开始检查是否是1,直到检查到0,如果之后全是0那么证明合法,如果之后又碰到了1那么这个子网掩码错误

我们先将这四个部分都放到一个整数mask中

unsigned int mask = (s1 << 24) | (s2 << 16) | (s3 << 8) | s4;

然后对mask进行检查,如果

位了方便我们检查我们定义一个int find0 = 0;表示我们是否在子网掩码中从做往右检查的过程中,找到了0

for(int front1 = 31; front1 >= 0; front1--)

if(!(mask & (1 << front1)))

如果我们发现了0,那么我们find0 = 1;

if(find0 == 1 && (mask & (1 << front1)))

如果我们发现了0之后,又发现了1那么我们这个子网掩码不合法

我们error++,并且break;跳出for循环

我们用同样的方法将ip地址的四个部分取出来

并进行ip地址分类

#include <stdio.h>
#include <string.h>int main() {char s[33];int a = 0;int b = 0;int c = 0;int d = 0;int e = 0;int error = 0;int private = 0;while (scanf("%s", s) != EOF) {//printf("our input is: %s\n", s);char* ip = strtok(s, "~");char* subnetmask = strtok(NULL, "~");//printf("ip : %s\nsubnetmask : %s\n", ip, subnetmask);int s1, s2, s3, s4;if ((sscanf(subnetmask, "%d.%d.%d.%d", &s1, &s2, &s3, &s4)) != 4) {error++;continue;}//printf("test s1: %d\n", s1);//现在我们开始对ip进行分类识别int ip1, ip2, ip3, ip4;if ((sscanf(ip, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4)) != 4) {//读取有问题//printf("error reason4: reading problem, ip is not correct.\n");//printf("%s\n", ip);error++;continue;}//printf("after valid subnetmask the ip1 is%d\n", ip1);if (ip1 == 0 || ip1 == 127) continue;int notValid = 0;if ((s1 == 0 && s2 == 0 && s3 == 0 && s4 == 0) || (s1 == 255 && s2 == 255 &&s3 == 255 && s4 == 255)) {//printf("error reason1: subnetmask is all zero or one.\n");//printf("subnetmask is %d.%d.%d.%d\n", s1, s2, s3, s4);error++;notValid = 1;} else if (s1 >= 0 && s1 <= 255 && s2 >= 0 && s2 <= 255 && s3 >= 0 &&s3 <= 255 && s4 >= 0 && s4 <= 255)  {unsigned int mask = (s1 << 24) | (s2 << 16) | (s3 << 8) | s4;//printf("mask : %u\n",mask);int find0 = 0;for (int front1 = 31; front1 >= 0; front1--) {if (!(mask & (1 << front1))) { //如果碰到了0,我们记录一下find0 = 1;}if ((mask & (1 << front1)) &&(find0 == 1)) { //如果已经碰到过0之后又碰到1那证明这个子网掩码错误notValid = 1;//printf("error reason2:subnet mask is not consecutive one and zero\n");//printf("%u\n", mask);error++;//printf("the subnet mask in binary is:\n");// for (int i = 31; i >= 0; i--) {//     unsigned int bit = (mask >> i) & 1;//     printf("%u", bit);// }//printf("\n");//printf("this subnetmask is not valid!\n");break;}}} else {//printf("error reason3: subnet mask not in ordinary range\n");//printf("%d.%d.%d.%d\n", s1, s2, s3, s4);error++;}//这个时候我们可以通过notValid来判断子网掩码是否是错误的,只有子网掩码正确的情况下我们才判断ipif (notValid) continue;if (ip1 > 0 && ip1 <= 255 && ip2 >= 0 && ip2 <= 255 && ip3 >= 0 && ip3 <= 255 &&ip4 >= 0 && ip4 <= 255) { // 如果我们的ip地址合法if (ip1 >= 1 && ip1 <= 126) {a++;//printf("a++ the ip1 is %d, ip2 is %d\n", ip1, ip2);if (ip1 == 10) {private++;}} else if (ip1 >= 128 && ip1 <= 191) {b++;if (ip1 == 172) {if (ip2 >= 16 && ip2 <= 31) {private++;}}} else if (ip1 >= 192 && ip1 <= 223) {c++;if ((ip1 == 192) && (ip2 == 168)) {private++;}} else if (ip1 >= 224 && ip1 <= 239) {d++;} else if (ip1 >= 240 && ip1 <= 255) {e++;}} else {//printf("error reason5: ip is not in ordinary range.\n");//printf("%s\n", ip);error++;}//printf("\n");}printf("%d %d %d %d %d %d %d", a, b, c, d, e, error, private);
}

又写了一个放在function里的

#include <stdio.h>
#include <string.h>
#define VALIDIP(a, b, c, d) (a >= 0 && a <= 255 && b >= 0 && b <= 255 && c >= 0 && c <= 255 && d >= 0 && d <= 255 )int isMaskValid(char* subnetmask) {int s1, s2, s3, s4;unsigned int mask;unsigned int max = -1;if ((sscanf(subnetmask, "%d.%d.%d.%d", &s1, &s2, &s3, &s4)) != 4) {return 0;} else if (VALIDIP(s1, s2, s3, s4)) {mask = (s1 << 24) | (s2 << 16) | (s3 << 8) | s4;if (mask == 0 || mask == max) return 0;else {while (!(mask & 1)) {mask >>= 1;max >>= 1;}}} else {return 0;}return mask == max;
}void classifyIP(char* s, int* a, int* b, int* c, int* d, int* e, int* error,int* private) {char *ip = strtok(s, "~");char *subnetmask = strtok(NULL, "~");int i[4];if ((sscanf(ip, "%d.%d.%d.%d", &i[0], &i[1], &i[2], &i[3])) == 4) {if (VALIDIP(i[0], i[1], i[2], i[3])){if(i[0] == 0 || i[0] == 127) return;else if (isMaskValid(subnetmask)){if(i[0] < 127) {(*a)++;if(i[0] == 10) (*private)++;} else if(i[0] < 192){(*b)++;if(i[0] == 172 && i[1] == 31) (*private)++;} else if(i[0] < 224){(*c)++;if(i[0] == 192 && i[1] == 168) (*private)++;} else if(i[0] < 240) (*d)++;else (*e)++;} else {(*error)++;}} else {(*error)++;}} else {(*error)++;}
}int main() {char s[33];int a = 0, b = 0, c = 0, d = 0, e = 0, error = 0, private = 0;while(scanf("%s", s) != EOF){classifyIP(s, &a, &b, &c, &d, &e, &error, &private);}printf("%d %d %d %d %d %d %d",a, b, c, d, e, error, private);
}

2024/10/29-21:34-2024/10/30-15:08

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/462445.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费送源码:Java+Springboot+MySQL Springboot酒店客房管理系统的设计与实现 计算机毕业设计原创定制

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对酒店客房管理等问题&#xff0c;对酒店客房…

力扣每日一题 超级饮料的最大强化能量 动态规划(dp)

来自未来的体育科学家给你两个整数数组 energyDrinkA 和 energyDrinkB&#xff0c;数组长度都等于 n。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。 你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而&#xff0c;如果从一种能量饮料切换到…

Linux高阶——1027—守护进程

1、守护进程的基本流程 1、父进程创建子进程&#xff0c;父进程退出 守护进程是孤儿进程&#xff0c;但是是工程师人为创建的孤儿进程&#xff0c;低开销模式运行&#xff0c;对系统没有压力 2、子进程&#xff08;守护进程&#xff09;脱离控制终端&#xff0c;创建新会话 …

抗疫物资管理:SpringBoot技术应用案例

目 录 摘 要 1 前 言 2 第1章 概述 2 1.1 研究背景 3 1.2 研究目的 3 1.3 研究内容 4 第二章 开发技术介绍 5 2.1相关技术 5 2.2 Java技术 6 2.3 MySQL数据库 6 2.4 Tomcat介绍 7 2.5 Spring Boot框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…

pandas——数据结构

一、series &#xff08;一&#xff09;创建series import pandas as pd#1.使用列表或数组创建Series # 使用列表创建Series&#xff0c;索引默认从0开始 s1 pd.Series([1, 2, 3]) print(s1) # 使用列表和自定义索引创建Series s2 pd.Series([1, 2, 3], index[a, b, c]) pr…

MySQL的SQL语句之触发器的创建和应用

触发器 Trigger 一.触发器 作用&#xff1a;当检测到某种数据表发生数据变化时&#xff0c;自动执行操作&#xff0c;保证数据的完整性&#xff0c;保证数据的一致性。 1.创建一个触发器 如上图所示&#xff0c;查看这个create的帮助信息的时候&#xff0c;这个create trig…

服务器数据恢复—DELL EqualLogic PS6100系列存储简介及如何收集故障信息?

DELL EqualLogic PS6100系列存储采用虚拟ISCSI SAN阵列&#xff0c;支持VMware、Solaris、Linux、Mac、HP-UX、AIX操作系统&#xff0c;提供全套企业级数据保护和管理功能&#xff0c;具有可扩展性和容错功能。DELL EqualLogic PS6100系列存储介绍&#xff1a; 1、上层应用基础…

什么是无限钱包系统?有什么优势?

在数字货币风起云涌的今天&#xff0c;一个名为“无限钱包系统”的创新平台正悄然引领着行业的变革。它不仅重新定义了数字资产的管理方式&#xff0c;更以卓越的安全性、便捷的操作体验以及前瞻性的技术理念&#xff0c;成为了广大数字货币爱好者心中的理想之选。 一、数字货币…

API网关 - JWT认证 ; 原理概述与具体实践样例

API网关主要提供的能力&#xff0c;就是协议转换&#xff0c;安全&#xff0c;限流等能力。 本文主要是分享 如何基于API网关实现 JWT 认证 。 包含了JWT认证的流程&#xff0c;原理&#xff0c;与具体的配置样例 API网关认证的重要性 在现代Web应用和微服务架构中&#x…

前端加密解密

一、 AES 加密与解密 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。是一种对称加密算法也就是加密和解密用相同的密钥; 1.1 使用 crypto-js 实现 AES 加密 1.1.1 参数说明 data 要加密的明文key 秘钥iv …

基于知识引导提示的因果概念提取(论文复现)

基于知识引导提示的因果概念提取(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 基于知识引导提示的因果概念提取(论文复现)论文概述论文方法提示构造器获取典型概念集聚类典型概念构建训练数据训练主题分类器概念提取器输入构造指针网络置信度评分训练损失…

【element ui系列】分享几种实现el-table表格单选的方法

在实际的开发中&#xff0c;经常会用到从表格中选择一条记录的情况&#xff0c;虽然官方给出的例子&#xff0c;但是给人感觉看起来不明显&#xff0c;于是&#xff0c;在此基础上做了改进。接下来&#xff0c;介绍两种常见的实现方法&#xff1a; 1、采用复选框(checkbox)实现…

63 mysql 的 行锁

前言 我们这里来说的就是 我们在 mysql 这边常见的 几种锁 行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁, 表共享锁, 表排他锁 意向共享锁, 意向排他锁, 主要是 为了表粒度的锁获取的同步判断, 提升效率 意向共享锁, 意向排他锁 这边主要的逻辑意义是数据表中是否有任…

江协科技STM32学习- P26 UART串口外设

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

使用 ADB 在某个特定时间点点击 Android 设备上的某个按钮

前提条件 安装 ADB&#xff1a;确保你已经在计算机上安装了 Android SDK&#xff08;或单独的 ADB&#xff09;。并将其添加到系统环境变量中&#xff0c;以便你可以在命令行中运行 adb。 USB调试&#xff1a;确保 Android 设备已启用 USB 调试模式。这可以在设备的“设置” -…

mint-ui Picker 显示异常

mint-ui Picker 显示异常 现象 最近一个老项目页面显示异常&#xff0c;使用mint-ui Picker显示异常,直接显示成了 数据对象&#xff0c;而不是具体travelName 字段 组件 mint-ui Picker 使用方式(vue方式) // template <mt-picker :slots"slots" value-key…

FastAPI性能对比:同步vs异步

大家好&#xff0c;FastAPI已成为构建Python API的最流行框架之一&#xff0c;因其速度和易用性而广受欢迎。但在构建高性能应用程序时&#xff0c;使用同步&#xff08;sync&#xff09;还是异步&#xff08;async&#xff09;代码执行是很重要的问题。本文将通过现实世界的性…

wx.setNavigationBarColor动态设置导航栏颜色无效(亲测有效)

wx.setNavigationBarColor动态设置导航栏颜色无效&#xff08;亲测有效&#xff09; 问题描述问题分析问题解决注意 问题描述 wx.setNavigationBarColor({frontColor: #E6E6E6,backgroundColor: #E6E6E6 })上面的代码设置后导航栏颜色没有变化&#xff0c;查看了app.json 以及…

Blender进阶:贴图与UV

9 UV 9.1 贴图与UV UV&#xff0c;指定每个面顶点在贴图上的坐标 演示&#xff1a; 1、添加物体 2、添加贴图&#xff0c;即图片纹理节点 3、进入UV Edit工作区 4、右边&#xff0c;选择一个面 5、左边&#xff0c;选择一个面&#xff0c;移动这个面 9.2 电子表格 电子…

利用LangChain与LLM打造个性化私有文档搜索系统

我们知道LLM&#xff08;大语言模型&#xff09;的底模是基于已经过期的公开数据训练出来的&#xff0c;对于新的知识或者私有化的数据LLM一般无法作答&#xff0c;此时LLM会出现“幻觉”。针对“幻觉”问题&#xff0c;一般的解决方案是采用RAG做检索增强。 但是我们不可能把…