您的位置:首页 > 其它

HDOJ--2206IP的计算

2012-12-11 18:42 375 查看
最近看了正则表达式,发现用这个来约束IP地址比较方便,只不过可读性不高

IPreg="((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)"
自己本身在学习TCP/IP协议,对网际IP协议有些了解,在HDOJ上找到了关于这方面的题目,于是小练习一下

ps:这题目WA了三次,最后发现原因居然是我用scanf输入的缘故,在用scanf("%s",s)的情况下,我输入0(空格)0(空格) 0(空格) 0,一下输出了四个NO,如果输入IP格式不正确,题目要求只要输出一个NO就够了,显然直接wrong了,这是由于scanf遇到空格将我输入的数据直接分成了四个部分,于是我换了gets(s)来实现输入,这样就不会出现上面的情况了。

/*
*判断输入IP地址是否正确
*/
#include<iostream>
#include<stdio.h>
using namespace std;
int check(char c)
{
if(c=='.'||(c>='0' && c<='9'))
return 1;
else
return 0;
}
int main()
{
int a[3],b[4];//数组a来记录.的下标,b记录四部分数据
char s[20];
int i,j;
int count,lens,flag;
while(gets(s)){
lens=strlen(s);
count=0,flag=1;
j=0;
for(i=0;i<lens;i++)
{
if(check(s[i])==0)//不满足条件
{
flag=0;
break;
}
}
for(i=0;i<lens;i++)
{
if(s[i]=='.')
{
count++;//记录.的个数
a[j++]=i;//记录.在字符串数组里的下标
}
}
if(count!=3)
flag=0;//no
else
{
for(i=1;i<3;i++){
if(a[0]==0 || (a[i]-a[i-1])<=1)//.的位置不合理
flag=0;
}
b[0]=b[1]=b[2]=b[3]=0;
//点分十进制的四部分数据
for(i=0;i<a[0];i++)
{
b[0]=b[0]*10+s[i]-48;
}
for(i=a[0]+1;i<a[1];i++)
{
b[1]=b[1]*10+s[i]-48;
}
for(i=a[1]+1;i<a[2];i++)
{
b[2]=b[2]*10+s[i]-48;
}
for(i=a[2]+1;i<lens;i++)
{
b[3]=b[3]*10+s[i]-48;
}
for(i=0;i<4;i++)
{
if(b[i]<0 || b[i]>255)
flag=0;
}
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: