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

该C++代码定义了函数来检查IP地址和子网掩码的有效性,并统计不同类别的IP地址数量。它首先将输入字符串分割,然后验证数字是否符合规则,最后根据网络段进行分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<sstream>

using namespace std;

void split(string& str, vector<string>& strs)
{
    stringstream ss(str);
    string temp;

    while(getline(ss, temp, '.'))
    {
        strs.push_back(temp);
    }
}

bool checkNum(string& str)
{
    if(str.size() == 0 || str.size() > 3)
    {
        return false;
    }

    for(int i = 0; i < str.size(); i++)
    {
        if(str[i] < '0' || str[i] > '9')
        {
            return false;
        }
    }

    int num = stoi(str);

    if(num >= 0 && num <= 255)
    {
        return true;
    }

    return false;
}

bool checkIP(vector<string> segs)
{
    if(segs.size() != 4)
    {
        return false;
    }

    for(int i = 0; i < segs.size(); i++)
    {
        if(!checkNum(segs[i]))
        {
            return false;
        }
    }

    return true;
}

bool checkMask(vector<string> segs)
{
    if(segs.size() != 4)
    {
        return false;
    }

    bool start = false;
    
    for(int i = 0; i < segs.size(); i++)
    {
        if(!checkNum(segs[i]))
        {
            return false;
        }

        int num = stoi(segs[i]);

        if(start)
        {
            if(num != 0)
            {
                return false;
            }
        }
        else
        {
            if(num != 255)
            {
                if(num == 0 || num == 128 || num == 192 || num == 224 || num == 240 || num == 248 || num == 252 || num == 254)
                {
                    start = true;
                }
                else
                {
                    return false;
                }
            }
        }
    }
    if(stoi(segs[3]) == 255)
    {
        return false;
    }
    if(segs[0] == "0" && segs[1] == "0" && segs[2] == "0" && segs[3] == "0")
    {
        return false;
    }

    return true;
}

void classify(vector<string>& ip, vector<int>& counter)
{
    int n1 = stoi(ip[0]);
    int n2 = stoi(ip[1]);

    if(n1 >= 1 && n1 <= 126)
    {
        counter[0]++;
        if(n1 == 10)
        {
            counter[6]++;
        }
    }
    else if(n1 >= 128 && n1 <= 191)
    {
        counter[1]++;
        if(n1 == 172 && n2 >= 16 && n2 <= 31)
        {
            counter[6]++;
        }
    }
    else if(n1 >= 192 && n1 <= 223)
    {
        counter[2]++;
        if(n1 == 192 && n2 == 168)
        {
            counter[6]++;
        }
    }
    else if(n1 >= 224 && n1 <= 239)
    {
        counter[3]++;
    }
    else if(n1 >= 240 && n1 <= 255)
    {
        counter[4]++;
    }
}

int main()
{
    string str;
    vector<int> counter(7, 0);

    while(cin >> str)
    {
        if(str == "aaa")
        {
            break;
        }
        int pos = str.find('~');

        string ip = str.substr(0, pos);
        string mask = str.substr(pos + 1, str.size() - pos - 1);

        vector<string> ip_segs;
        vector<string> mask_segs;

        split(ip, ip_segs);
        split(mask, mask_segs);

        if(!checkIP(ip_segs) || !checkMask(mask_segs))
        {
            counter[5]++;
        }
        else
        {
            classify(ip_segs, counter);
        }
    }

    for(int i = 0; i <= 6; i++)
    {
        cout << counter[i] << " ";
    }

    cout << endl;

    return 0;
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值