想找个现成的直接用都找不到,只好自己写了
直接上码

1.c

// 编译 gcc 1.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 通过IP地址和子网掩码计算网络号,传入正确的ip,正确的netmask,网络号,网络号长度。 成功返回1,失败返回0
int ip_netmask_to_NSID(char* ip, char* netmask, char* NSID, int size)
{
    int ip_len = 0;
    int netmask_len = 0;
    int temp_len = 0;
    int temp_len2 = 0;
    int ip_arr[4] = {0};
    int netmask_arr[4] = {0};
    int NSID_arr[4] = {0};
    int i = 0;
    char temp_str[4] = {0};
    char NSID_str[16] = {0};
    char* p_ip = ip;
    char* p_netmask = netmask;

    // 临时指针
    char* temp = NULL;
    // 4次循环依次获取每位ip
    for(i = 0; i < 4; i++)
    {
        // printf("i=%d\n", i);
        ip_len = strlen(p_ip);
        // 获取'.'首次出现的位置
        if(i != 3)
        {
            temp = strchr(p_ip, '.');
            if(NULL == temp)
            {
                return 0;
            }
        }
        else
        {
            temp = p_ip;
        }
        temp_len = strlen(temp);
        // printf("temp_len=%d\n", temp_len);
        // 计算第一位ip的长度
        if(i != 3)
        {
            temp_len2 = ip_len - temp_len;
        }
        else
        {
            temp_len2 = temp_len;
        }
        // printf("temp_len2=%d\n", temp_len2);
        // 字符串截取
        memset(temp_str, 0, sizeof(temp_str));
        strncpy(temp_str, p_ip, temp_len2);
        // 存入数组
        ip_arr[i] = atoi(temp_str);
        // printf("ip_arr[%d]=%d\n", i, ip_arr[i]);
        // 前3个进行指针偏移
        if(i != 3)
        {
            p_ip += (temp_len2 + 1);
        }
    }

    temp = NULL;
    temp_len = 0;
    temp_len2 = 0;

    // 4次循环依次获取每位netmask
    for(i = 0; i < 4; i++)
    {
        // printf("i=%d\n", i);
        netmask_len = strlen(p_netmask);
        // 获取'.'首次出现的位置
        if(i != 3)
        {
            temp = strchr(p_netmask, '.');
            if(NULL == temp)
            {
                return 0;
            }
        }
        else
        {
            temp = p_netmask;
        } 
        temp_len = strlen(temp);
        // printf("temp_len=%d\n", temp_len);
        // 计算netmask的长度
        if(i != 3)
        {
            temp_len2 = netmask_len - temp_len;
        }
        else
        {
            temp_len2 = temp_len;
        }
        // printf("temp_len2=%d\n", temp_len2);
        // 字符串截取
        memset(temp_str, 0, sizeof(temp_str));
        strncpy(temp_str, p_netmask, temp_len2);
        // 存入数组
        netmask_arr[i] = atoi(temp_str);
        // printf("netmask_arr[%d]=%d\n", i, netmask_arr[i]);
        // 前3个进行指针偏移
        if(i != 3)
        {
            p_netmask += (temp_len2 + 1);
        }
    }

    temp = NULL;

    // 计算各位网络号
    for(i = 0; i < 4; i++)
    {
        NSID_arr[i] = ip_arr[i] & netmask_arr[i];
    }
    
    // 拼接为完整的网络号
    snprintf(NSID_str, 15, "%d.%d.%d.%d", NSID_arr[0], NSID_arr[1], NSID_arr[2], NSID_arr[3]);

    strncpy(NSID, NSID_str, size);

    return 1;
}

int main()
{
    char ip1[16] = "192.168.10.1";
    char netmask1[16] = "255.255.255.0";
    char ip2[16] = "192.168.10.100";
    char netmask2[16] = "255.255.255.224";
    char ip3[16] = "192.168.10.200";
    char netmask3[16] = "255.255.255.255";
    char NSID[16] = {0};

    if(0 == ip_netmask_to_NSID(ip1, netmask1, NSID, 15))
    {
        printf("0\n");
    }
    else
    {
        printf("NSID:%s\n", NSID);
    }

    if(0 == ip_netmask_to_NSID(ip2, netmask2, NSID, 15))
    {
        printf("0\n");
    }
    else
    {
        printf("NSID:%s\n", NSID);
    }

    if(0 == ip_netmask_to_NSID(ip3, netmask3, NSID, 15))
    {
        printf("0\n");
    }
    else
    {
        printf("NSID:%s\n", NSID);
    }

    return 0;
}

效果如下

C语言实现通过IP和子网掩码计算网络号_i++