c语言 ip字符串转int,ipv4的ip字符串转化为int型

要求:

将现有一个ipv4的ip字符串(仅包含数字,点,空格), 其中数字和点之间的空格(至多一个)是合法的,比如“12 .3. 4 .62”,其他情况均为非法地址。写一个函数将ipv4地址字符串转化成int整数(只能遍历一遍字符串)。

实现思路:

1. 安全检查,null指针

2. 排除最容易的情况:长度、首/尾是否合法

3. 遍历(第2~第len-1个元素):

数字只考虑数值计算以及是否超出范围

" "前后只能为数字和"."

"."前后分别可以为数字或" ";"."不能超过3个;更新数组索引

#include

#include

int is_digit(char ch)

{

return (ch>='0' && ch<='9')? 1:0;

}

int ipv4_to_int(char* str, int* part)

{

int len=0,index=0,i=0;

char* ps=str;

if(ps == null || part ==null)

return -1;

len=strlen(ps);

if(len<7 || len >21)

return -1;

if(!is_digit(ps[0]) || !is_digit(ps[len-1]) )

return -1;

part[index]=part[index]*10+(int)(ps[0]-'0');

for(i=1;i

char ch = ps[i];

if(is_digit(ch)){

part[index]=part[index]*10+(int)(ch-'0');

if(part[index]>255)

return -1;

}

else if(ch==' ')

{

if( (is_digit(ps[i-1]) && ps[i+1]=='.') || \

(ps[i-1]=='.' && is_digit(ps[i+1])) )

continue;

else

return -1;

}

else if(ch=='.')

{

if( (is_digit(ps[i-1]) || ps[i-1]==' ') && \

(ps[i+1]==' ' || is_digit(ps[i+1])) )

{

index++;

if(index>3)

return -1;

}

else

return -1;

}

else

return -1;

}

part[index]=part[index]*10+(int)(ps[i]-'0');

if(part[index]>255)

return -1;

return 0;

}

int main(int argc, char *argv[])

{

char exm[16][30]={

"255.255.255.255",

"0.0.0.0",

"12 .3. 4 .56",

{},

"2.3..",

"121 . 234 . 114 . 115.",

".12.4.7.7",

"123.34.55.",

"1.3.5.4.2.4",

" 123.3.4.5",

"123.45.67.67 ",

"12 3. 45.67. 67",

"12.256.0.1",

"a1.34.45.6",

"34.56.-2.5",

". . .",

};

int part[4]={0,0,0,0};

int j=0;

for(j=0;j<15;j++){

if(!ipv4_to_int(exm[j], part))

printf("ip_addr: %30s is ====> %d.%d.%d.%d\n",exm[j], part[0],part[1],part[2],part[3]);

else

printf("ip_addr: %30s is invalid !!!\n",exm[j]);

part[0]=part[1]=part[2]=part[3]=0;

}

return 0;

}

欢迎大家批评指正!!     :-)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值