2016-2017学年第三次测试赛 问题 F: 签到题

问题 F: 签到题

时间限制: 1 Sec  内存限制: 128 MB
提交: 80  解决: 28

题目描述

在计算机网络考试中, 黑帅男神看到一个将IP网络分类的题, 精通C++的他瞬间写出了几行代码成功解决了这个问题

请解析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地址进行分类
 

输入

多组,第一行是一个T(T<=100000)
接下来T行,每行一个ip地址(不保证正确)

输出

在上面5类中则输出对应类型
不属于上述类型或IP错误则输出”nope”(不含引号)

样例输入

2 222.195.8.207 127.0.0.1

样例输出

C nope
 
这题的思路很明确,就是:
1.以“.”为分界,读取ip地址的每位一个段;
2.然后首先判断是否是在1~225的范围内,然后判断前后有没有那些倒灶的字符串导致其根本不符合IP地址的标准;
3.然后有一个小点,就是第一个字段的127不属于任何范围。
 
实现需要的一些小技巧:sscanf
sscanf的功能很强大,使用必须要哟有<stdio.h>头文件,然后要和c++兼容的话我有头文件<cstdio.h>这样就可以在C++的环境下使用这个函数了。
sscanf功能的参考博文:http://blog.csdn.net/jackyvan/article/details/5349724
附上代码:
#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<stdlib.h>
#include<iterator>
#include<sstream>
#include<string.h>
#include<stdio.h>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int a,b,c,d;
    char ip[50]={};
    char s[200]={};
    while(n--)
    {
        a=-1;
        b=-1;
        c=-1;
        d=-1;
        cin>>ip;

        sscanf(ip,"%d.%d.%d.%d%s",&a,&b,&c,&d,s);//sscanf读取每个字段,1以“.”为分界
    //而且最大的好处是可以把字符串转化为int型的数组 那是甚好的。
        if(s[0]!=0||a>255 || a<0 || b>255 || b<0 ||c>255 || c<0 ||d>255 || d<0 )
        {
            cout<<"nope"<<endl;//第一组,判断就是判断是否每个字段都在 1~225的范围内
            continue;//不在 直接去下一个数
        }
       else if(a>=1&&a<=126)//根据第一组的数据判断是否在A组
        {
            cout<<"A"<<endl;
            continue;
        }
       else if(a>=128&&a<=191)//根据第一分段判断是否在B组
        {
            cout<<"B"<<endl;
            continue;
        }
       else if(a>=192&&a<=223)//判断是否在第C组
        {
            cout<<"C"<<endl;
            continue;
        }
      else  if(a>=224&&a<=239)//判断是否在D组
        {
            cout<<"D"<<endl;
            continue;
        }
      else  if(a>=240&&a<=255)//判断是否在E组
        {
            cout<<"E"<<endl;
            continue;
        }
        else
        {
            cout<<"nope"<<endl;//最后就是在1~225的范围内 第一个字段不符合要求的那些数字的排除
            continue;
        }


    }
    return 0;
}
 
 
原文地址:https://www.cnblogs.com/William-xh/p/7144347.html