C语言解析ip地址的字符串转换为整型例程

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

long ivp4ToInt(char *str){
    int i,slen = 0;
    int numTemp = 0;
    int dotNum = 0;
    int bitNum = 0;
        long  ipNum = 0;
    if(str == NULL){            //IP地址字符串为空
        printf("str == NULL\n");
        return -1;
    }
    slen =strlen(str);
    if(slen < 7 || slen > 15){   //判断ip地址的长度是否正确,最小“X.X.X.X”,最大“XXX.XXX.XXX.XXX”
        printf("strlen(str) < 7 or strlen(str)>15\n");
        return -1;
    }
    if(str[0] == '.' || str[slen-1] == '.'){  //判断时否为以“.”开头或者结尾
        printf("ip format error\n");
        return -1;
    }
    for(i=0; i<slen; i++){
        if(str[i] == '.'){            // 判断是否“X..X”,两个点相连
            if(str[i-1] == '.'){
                printf("pStr == . format error\n");
                return -1;
            }
            if(++dotNum > 3){   // 判断“."的个数是否大于3个以上
                printf("dot number over 3\n");
                return -1;
            }
            if(numTemp > 255){ 
                printf("numTemp > 255, numTemp :%d\n",numTemp);
                return -1;
            }
            ipNum |= numTemp;
            numTemp = 0;
            ipNum <<= 8;
            bitNum =0;
            continue ;
        }
        if(str[i] < '0' || str[i] > '9'){  //ip内的字符是否为纯数字
            printf("ip addr error, str :%c\n",str[i]);
            return -1;
        }
        numTemp = numTemp*10 + (str[i] - '0');  //计算单个地址的数值
        if(++bitNum > 3){   //判断单个地址位数是否超过3位数
            printf("ip addr bit number error\n");
            return -1;
        }
    }
    if(dotNum != 3){    //判断传入的字符串“.”的个数是否为3个
        printf("dotNum != 3\n");
        return -1;
    }
    ipNum |= numTemp;
    printf("ipNUm :%lx\n", ipNum);
    return ipNum;
}

void main()
{
    printf("return :%d\n",ivp4ToInt(".123.xxx"));
    printf("return :%d\n",ivp4ToInt("123.134."));
    printf("return :%d\n",ivp4ToInt("2111."));
    printf("return :%ld\n",ivp4ToInt("123..123"));
    printf("return :%ld\n",ivp4ToInt("1X2.123.12"));
    printf("return :%ld\n",ivp4ToInt("123,123,123"));
    printf("return :%ld\n",ivp4ToInt("123.123,123"));
    printf("return :%ld\n",ivp4ToInt("123.323.123"));
    printf("return :%ld\n",ivp4ToInt("192.168.123"));
    printf("return :%ld\n",ivp4ToInt("192.168.123.125"));
    printf("return :%ld\n",ivp4ToInt("19.16.1.12.5"));
    printf("return :%ld\n",ivp4ToInt("255.255.255.255"));
    printf("return :%ld\n",ivp4ToInt("1.0.2.4"));

}

ip地址采用将字符串位成为整型,但是因为IP地址最大位255.255.255.255,转化为整型范围超过了int的取值范围,所以应该为unsigned int类型,因为本例中转换失败时函数返回-1,所以就定义为long型,long在64位机时才是64,如果时在32或者16位机时也是32位,范围依然不够,需要更改为unsigned int类型。

参考思路如该文章:https://www.yuanmas.com/info/okzVlD4oyv.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值