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

识别有效的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,返回错误

全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务