识别有效的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类地址是不冲突的
    对应牛客网HJ18 识别有效的IP地址和掩码并进行分类统计

思路分析

本题逻辑倒没什么特别复杂的,重点就是模拟用户输入和划分类型的过程。
不过值得注意的是,在划分类型时,需要注意无效IP和错误IP的判断时机,我最初就是因为没能在判断错误IP之前先过滤掉无效IP,导致两者数量有一定重叠,以至于错误提交了很多次。(下面我会附上我的提交记录,也算是提供一个负面案例了)
代码提交记录

代码实现

#include <stdio.h>
#include <stdlib.h>// 判断掩码是否合法 0 错误, 1 正确
int is_valid_mask(const char* mask) {unsigned int m[4];// 读取掩码,并分成4个数字if (sscanf(mask, "%u.%u.%u.%u", &m[0], &m[1], &m[2], &m[3]) != 4) {return 0; // 掩码不合法,返回错误}// 将掩码的四个部分组合成一个32位整数unsigned int num = (m[0] << 24 | m[1] << 16 | m[2] << 8 | m[3]);if (num == 0 ||num == 0xFFFFFFFF) return 0; // 若全为0或全为1,返回错误// 一个标识,标记发现的第一个为0的位int first_zero_found = 0;for (int i = 31; i >= 0; i--) {if (!first_zero_found && !(num & (1 << i))) {// 若还没有找到0,且当前位为0first_zero_found = 1;} else if (first_zero_found && (num & (1 << i))) {// 若前面已有0,而当前位为1,证明掩码中0和1是不连续的,不合法return 0;}}return 1;
}int is_private(unsigned int ip) {unsigned int ip1 = (ip >> 24) & 0xFF;unsigned int ip2 = (ip >> 16) & 0xFF;return (ip1 == 10 || (ip1 == 172 && ip2 >= 16 && ip2 <= 31) || (ip1 == 192 &&ip2 == 168));
}int main() {char line[100];int counts[7] = { 0 }; // A,B,C,D,E,error,privatewhile (fgets(line, sizeof(line), stdin)) {char ip[20], mask[20];// 分隔ip和掩码,并分别存储到数组中。若分割后发现不止ip和mask这两个,证明不合法,error+1if (sscanf(line, "%[^~]~%s", ip, mask) != 2) {counts[5]++;continue;}// 把ip和掩码的每一段数字都存进数组中,若不合法,error+1unsigned int ip_parts[4];unsigned int mask_parts[4];if (sscanf(ip, "%u.%u.%u.%u", &ip_parts[0], &ip_parts[1], &ip_parts[2],&ip_parts[3]) != 4 ||sscanf(mask, "%u.%u.%u.%u", &mask_parts[0], &mask_parts[1], &mask_parts[2],&mask_parts[3]) != 4) {counts[5]++;continue;}unsigned int ip_num = (ip_parts[0] << 24) | (ip_parts[1] << 16) |(ip_parts[2] << 8) | ip_parts[3];unsigned int first_octet = ip_parts[0];// 若第一部分是0或127,忽略if (first_octet == 0 || first_octet == 127) continue;if (!is_valid_mask(mask)) {counts[5]++;continue;}// 判断是否是私有IPif (is_private(ip_num)) {counts[6]++;}if (first_octet >= 1 && first_octet <= 126) {counts[0]++;} else if (first_octet >= 128 && first_octet <= 191) {counts[1]++;} else if (first_octet >= 192 && first_octet <= 223) {counts[2]++;} else if (first_octet >= 224 && first_octet <= 239) {counts[3]++;} else if (first_octet >= 240 && first_octet <= 255) {counts[4]++;} else {counts[5]++;}}printf("%d %d %d %d %d %d %d\n", counts[0], counts[1], counts[2], counts[3],counts[4], counts[5], counts[6]);return 0;
}

因为这个代码主要是模拟的过程,所以逻辑并不复杂。但像我那样因为粗心大意,导致很多次错误提交的行为,也足以让人引以为戒了。
希望本文能对您有所帮助。
感谢阅读!

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

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

相关文章

opencv改变像素点的颜色---------c++

改变像素点的颜色 #include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include <filesystem>bool opencvTool::changeColor(const std::string image_p, int x_coor, int y_coor, const cv::Scalar color) {std::filesystem::path file(image_p);…

大模型检索召回系统:RAG技术的全面调查与未来展望

随着人工智能技术的飞速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了显著成就。然而&#xff0c;这些模型在处理特定领域或知识密集型任务时仍面临挑战&#xff0c;如产生错误信息或“幻觉”。为了克服这些难…

MC33665 + MC33774 控制流程及 TPL3 帧结构介绍

一. 概述&#xff1a; MC33665A&#xff1a;通用电池管理通信网关和变压器物理层 (TPL) 收发器。该设备通过标准通信协议转发来自不同 TPL&#xff08;NXP 的隔离菊花链协议&#xff09;端口的消息&#xff0c;标准通信协议可确保与市场上可用的微控制器兼容。 MC33774&…

vue实现进入某个页面后替换地址栏路径

需求背景&#xff1a;a系统进入b系统首页&#xff08;"/index"&#xff09;需要携带token&#xff0c;如 example.com/index?token"thisIsMyToken" 需要再b系统中将地址栏携带的token清除 getBtnType(type) {this.$router.push({path: "/",quer…

Fork for Mac v2.42 激活版 Git客户端

Fork for Mac是一款运行在Mac平台上的Git客户端&#xff0c;Fork Mac版具备基本的取、推、提交、修改、创建和删除分支和标签、创建和删除远程备份等功能&#xff0c;还有实用的差异查看器&#xff0c;你可以通过清晰的视图快速发现源代码中的更改。 Fork for Mac v2.42 激活版…

Golang | Leetcode Golang题解之第42题接雨水

题目&#xff1a; 题解: func trap(height []int) (ans int) {n : len(height)if n 0 {return}leftMax : make([]int, n)leftMax[0] height[0]for i : 1; i < n; i {leftMax[i] max(leftMax[i-1], height[i])}rightMax : make([]int, n)rightMax[n-1] height[n-1]for i…

常见术语:DI/DO、AI/AO 和 I/O

在自动化和控制系统领域&#xff0c;DI/DO、AI/AO 和 I/O 是常见的术语&#xff0c;分别代表不同类型的输入输出接口。它们在工业自动化、楼宇自动化、机器人技术等领域有广泛应用。下面详细解释这些术语及其使用示例。 一、DI/DO&#xff08;数字输入/数字输出&#xff09; 数…

React vs React Native写法上的不同

标签 <div> -> <View> / <ScrollView><p> -> <Text><input> -> <TextInput><image> -> <Image><button> -> <Button>css background-image -> <ImageBackground> 除此之外还有一…

一个简单的kafka 消费者

写一个简单的kafka 消费者 1. 依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency>2. 消费者 import com.xxxx.npi.module.common.msg.enums.Topic; import org.apache.…

watchEffect的使用

watchEffect 是 Vue 3 Composition API 中的一个函数&#xff0c;它用于在响应式数据变化时自动执行一个副作用函数。与 watch 不同&#xff0c;watchEffect 会自动收集其执行过程中访问到的响应式依赖&#xff0c;并在这些依赖发生变化时重新运行副作用函数。这意味着你不需要…

预防oracle的漏洞及其提权

防止Oracle数据库的漏洞及其潜在的权限提升&#xff0c;需要实施一系列综合的安全措施。这些措施不仅涉及技术配置&#xff0c;还包括过程管理和持续的安全评估。以下是有效防御Oracle数据库漏洞和提权攻击的一些关键步骤&#xff1a; 1. 安装和配置 安装最新安全补丁 定期更…

git提交注释规范插件

1、前言 为什么要注重代码提交规范&#xff1f; 在团队协作开发时&#xff0c;每个人提交代码时都会写 commit message。 每个人都有自己的书写风格&#xff0c;翻看我们组的git log, 可以说是五花八门&#xff0c;十分不利于阅读和维护。 一般项目开发都是多分支共存&#x…

关于CPP类中字符串成员初始化

直接看代码吧 #include <iostream> #include <string>/* A string is actually an object of the C++ Standard Library class string. This class is defined in header <string>, and the name string, like cout, belongs to namespace std. To enable …

kvm使用virt-clone克隆虚拟机

首先使用命令查看系统安装的所有虚拟机: virsh list --all然后使用如下命令进行虚拟机的克隆: virt-clone -o generic -n generic-1 -f /var/lib/libvirt/images/generic-1.qcow2-o后面要克隆的虚拟机名称 -n是新的虚拟机的名称 -f是生成的新的虚拟机磁盘文件路径(一般是/var…

Seal^_^【送书活动第2期】——《Flink入门与实战》

Seal^_^【送书活动第2期】——《Flink入门与实战》 一、参与方式二、本期推荐图书2.1 作者简介2.2 编辑推荐2.3 前 言2.4 本书特点2.5 内容简介2.6 本书适用读者2.7 书籍目录 三、正版购买 一、参与方式 评论&#xff1a;"掌握Flink&#xff0c;驭大数据&#xff0c;实战…

Ubuntu下部署gerrit+报错分析(超详细)

Ubuntu下部署gerrit代码平台 之前安装过几次 最后都在Apache代理这里失败了&#xff0c;如下图&#xff0c;总是gerrit.config与Apache2.config配置有问题&#xff0c;后面换了使用ngnix代理&#xff0c;简单多了 安装Mysql、gerrit、jdk、git 这一步也是非必须得&#xff0…

【c++】list类接口函数介绍与深度剖析模拟实现

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章来到list有关部分&#xff0c;这一部分函数与前面的类似&#xff0c;我们简单讲解&#xff0c;重难点在模拟实现时的迭代器有关实现 目录 1.List介绍2.接…

Go 之为什么 rune 是 int32 的别名而不是 uint32 的别名

我对这个问题其实也是一直有疑问的&#xff0c;毕竟像 byte 都是 uint8 的别名。然后找了一些问答资料&#xff0c;不知道还没有没其他更好的解释。 范围足够 在 Unicode 字符集中&#xff0c;一个字符的码点范围是从 U0000 到 U10FFFF&#xff0c;共计 1114112 个码点&#…

转向敏捷财务规划,实现更快更自信的决策

随着数字化的到来&#xff0c;原本基于电子表格的时代正逐渐拉下帷幕&#xff0c;大部分企业开始摆脱依赖于电子表格进行计划、预算和预测的传统规划系统&#xff0c;寻求更符合当今市场要求的敏捷财务规划。但不得不承认&#xff0c;当下电子表格仍然是多数企业使用最广泛的工…

代码随想录-字符串 | 右旋字符串

代码随想录-字符串 | 7右旋字符串 卡码网 右旋字符串解题思路代码复杂度难点总结 卡码网 右旋字符串 题目链接 题目描述 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串…