利用字符流进行数据读入真的是非常方便

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

http://www.nowcoder.com/questionTerminal/de538edd6f7e4bc3a5689723a7435682

#include<bits/stdc++.h>

using namespace std;

void vecip2usn(vector<int> ip, unsigned int &rtn)
{
    rtn = 0;
    // 将点分十进制的ip字符串转换为ip数字
    for(int i=0;i<ip.size();i++){
        rtn = (rtn<<8)+ip[i];
    }
}

bool judgemask(vector<int> mask)
{
    if(mask.size()!=4)
        return false;

    unsigned int maskt(0);
    vecip2usn(mask, maskt);

    if(maskt==0xffffffff||maskt==0x00000000)
        return false;

    unsigned int f = 0x80000000;
    while(maskt){
        if((maskt&f)==0)
            break;
        maskt = maskt&(~f);
        f = f>>1;
    }
    if(maskt)
        return false;
    return true;

}

bool isip(vector<int> ipnum)
{
    for(auto val:ipnum){
        if(val<0||val>255)
            return false;
    }
    return true;
}

int parseip(string ip_mask, vector<int> &ipnum, vector<int> &masknum)
{
    // 解析得到点分十进制ip地址中的数字
    string ip;
    string mask;
    // 先得到ip和掩码的字符串
    int posbol = ip_mask.find('~');
    ip = string(ip_mask.begin(),ip_mask.begin()+posbol);
    mask = string(ip_mask.begin()+posbol+1, ip_mask.end());

    replace(ip.begin(),ip.end(),'.',' ');
    replace(mask.begin(),mask.end(),'.',' ');
    istringstream ipstream(ip);
    istringstream maskstream(mask);

    int t(0);
    while(ipstream>>t){
        ipnum.push_back(t);
    }
    while(maskstream>>t){
        masknum.push_back(t);
    }
    return 0;
}

int main()
{
    int A(0),B(1),C(2),D(3),E(4),ERR(5),PRI(6);
    vector<int> out(7, 0);
    string ip;
    while(cin>>ip)
    {
        vector<int> ipnum;
        vector<int> masknum;
        parseip(ip, ipnum, masknum);
        if(ipnum.size()!=4||masknum.size()!=4){
            out[ERR]++;    // 错误的IP或者掩码
            continue;
        }
        if(judgemask(masknum)==false||isip(ipnum)==false)
        {
            out[ERR]++;
            continue;
        }
        if(ipnum[0]==0||ipnum[0]==127)
        {
            continue;
        }
        if(ipnum[0]>=1&&ipnum[0]<=126){
            out[A]++;
            if(ipnum[0]==10)
                out[PRI]++;
            continue;
        }
        if(ipnum[0]>=128&&ipnum[0]<=191){
            out[B]++;
            if(ipnum[0]==172&&ipnum[1]<=31&&ip[1]>=16)
                out[PRI]++;
            continue;
        }
        if(ipnum[0]>=192&&ipnum[0]<=223){
            out[C]++;
            if(ipnum[0]==192&&ipnum[1]==168)
                out[PRI]++;
            continue;
        }
        if(ipnum[0]>=224&&ipnum[0]<=239){
            out[D]++;
        }
        if(ipnum[0]>=240){
            out[E]++;
        }
    }
    for(int i=0;i<out.size()-1;i++)
    {
        cout<<out[i]<<' ';
    }
    cout<<out.back()<<endl;

    return 0;
}

parseip()先读入字符串,然后找到~的位置,然后分开ip和掩码,再用replace替换'.' 为空格读入ip和掩码。
点分十进制如果没有读入4个数字都是错误的
vecip2usn把ip转换成一个无符号整形数
judgemask判断mask是否正确,先判断是否全1或全0,然后从左到右依次把1置为0,碰到0停止,如果得到的mask不为0,返回错误

全部评论

相关推荐

11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
威猛的小饼干正在背八股:挂到根本不想整理
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务