zoukankan      html  css  js  c++  java
  • 识别有效的IP地址和掩码并进行分类统计

    该题我的想法是把每一个ip看出一个整数,将读取得到的数据一一与给定的ip范围比较即可。另外本题应该注意的地方是scanf读取俩字符串的方法。

    代码如下:

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<iostream>
      4 using namespace std;
      5 
      6 unsigned long long range[8][2] = {
      7     {10000000000,10255255255},
      8     {172016000000,17231255255},
      9     {192168000000,192168255255},
     10 
     11     {1000000000,126255255255},
     12     {128000000000,191255255255},
     13     {192000000000,223255255255},
     14     {224000000000,239255255255},
     15     {240000000000,255255255255},
     16 };
     17 
     18 int explain(char* ip){
     19      int expect = 1;
     20      int cnt = 0;
     21      for(int i = 0 ; i < strlen(ip) ; i ++){
     22 
     23         if(ip[i] >= '0' && ip[i] <= '9'){
     24             expect = 1;
     25         }
     26         else{
     27             if(expect == 0) return -1;
     28             expect = 0;//下一个字符必须是数字
     29             cnt ++;
     30         }
     31      }
     32     if(cnt != 3) return -1;// 必须有三个.符号
     33     return  1;
     34 }
     35 
     36 int main(){
     37     char ip[20] , code[20];
     38     int a = 0 , b = 0 , c = 0 , d = 0 , e = 0 ,eip = 0 , sip = 0;
     39     int cnt = 0;
     40     while(scanf("%[^~]~%s",ip,code) != EOF){
     41         int cds = explain(code);
     42         int flag = 0;
     43         if(cds > 0){
     44              int aa[4];
     45              sscanf(code , "%d.%d.%d.%d" , &aa[0],&aa[1],&aa[2],&aa[3]);
     46             if(aa[0] > 255 || aa[1] > 255 || aa[2] > 255 || aa[3] > 255 || (aa[0] == 255 && aa[1] == 255 && aa[2] ==255 &&aa[3]==255 )){
     47             //qudiao 255.255.255.255 以及在某个位上大于255的不合法的mask
     48                 eip ++;
     49                 flag = 1;
     50             }
     51             int exp = 1;
     52             for(int i = 0 ; !flag && i < 4 ; i ++){
     53                 if(exp == 0 && aa[i] || aa[i] > 255){
     54                     eip ++;
     55                     flag = 1;
     56                     break;
     57                 }
     58                 int a1 = aa[i];
     59                 if(a1 < 255){
     60                     if(a1 == 128 || a1 == 192 || a1 == 224 || a1 == 240 || a1 == 248 || a1 == 252 || a1 == 254){
     61                         exp = 0;
     62                     }else if(a1 == 0 && i > 0){
     63                         exp = 0;//去除0.0.0.0
     64                     }
     65                     else{
     66                         eip ++;
     67                         flag = 1;
     68                         break;
     69                     }
     70                 }
     71            }
     72         }else{
     73             flag = 1;
     74             eip ++;
     75         }//end
     76         if(flag == 0){
     77             int ips = explain(ip);
     78             if(ips > 0){
     79 
     80                 int a1 , b1 ,c1 ,d1;
     81                 sscanf(ip , "%d.%d.%d.%d" , &a1,&b1,&c1,&d1);
     82                 if(a1>255 || b1 > 255 || c1 > 255 || d1 > 255){
     83                     eip++;
     84                     flag = 1;
     85                 }
     86                 if(flag == 0){
     87                     long long ans = a1*1e9 + b1*1e6 + c1*1e3 + d1;
     88                     //cout<<ans<<endl;
     89                     int i = 0;
     90                     for( ; i < 8 ; i ++){
     91                         if(ans <= range[i][1] && ans >= range[i][0]){
     92                             // cout<<i<<endl;
     93                             if(i == 3) a ++;
     94                             if(i == 4) b ++;
     95                             if(i == 5) c ++;
     96                             if(i == 6) d ++;
     97                             if(i == 7) e ++;
     98                             if(i == 0 || i == 1 || i == 2) sip ++;
     99                             //break;
    100                         }
    101                     }
    102                 }
    103             }else{
    104                 eip ++;
    105             }
    106         }
    107        memset(ip,'',sizeof ip);
    108        memset(code,'',sizeof(code));
    109        getchar();
    110     }
    111     printf("%d %d %d %d %d %d %d
    ",a,b,c,d,e,eip,sip);
    112     return 0;
    113 }
  • 相关阅读:
    tomcat源码springboot搭建的跑包含websocket的项目
    tomcat源码ant编译
    职责链设计模式最简单的实例
    完美解决asp.net core 3.1 两个AuthenticationScheme(cookie,jwt)共存在一个项目中
    基于领域驱动设计(DDD)超轻量级快速开发架构(二)动态linq查询的实现方式
    Html5 在手机端 input 默认弹出英文键盘
    Html Table 表格 画斜线
    多个单列索引和联合索引的区别
    springboot常用功能
    前端代码评审(Code Review)
  • 原文地址:https://www.cnblogs.com/castlehappiness/p/5836303.html
Copyright © 2011-2022 走看看