Problem Description
在网络课程上,我学到了很多有关IP的知识。IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如192.168.100.16,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。
但是粗心的我,常常将IP地址写错,现在需要你用程序来判断。
Input
输入有多个case,每个case有一行,不超过100个字符。
Output
对于每个case,判断输入的IP是否正确,如果正确输入YES,否则NO。
Sample Input
192.168.100.16
Sample Output
YES
*/
/*
解题分析:
首先IP的格式为 0—255.0-255.0-255.0-255 中间不能出现其他的,
还有不能有 01.01.01.01 每段以0打头,每段是零的话,只能是0.0.0.0
不能是000.000.000.000;
只有数字和点组成;
*/
#include<stdio.h>
#include<string.h>
int main()
{
char p[10010];
int a[10];
int sum,sum1;
int i,j,k,q;
while(gets(p)!=NULL)
{
memset(a,0,sizeof(a));
j=0;
q=1;
while(p[j]!='\0') //此行目的为了判断该字符是否完全有数字和点组成
{
if(p[0]=='.') //第一个为.的话,不满足情况
{
q=0;
break;
}
if(p[j]=='.')
{
if(p[j+1]=='.'||p[j+1]=='\0') //最后一个为.去掉 ,中间有连续的去掉,不满足情况
{
q=0;
break;
}
else
j++;
}
else if(p[j]<='9'&&p[j]>='0')
{
j++;
}
else
{
q=0;
break;
}
}
if(q==1) //仅有数字和点 ,且首位不是点
{ i=0;
sum=0;
sum1=0;
k=1;
while(p[i]!='\0')
{
if(p[i]!='.')
{
if(sum==0&&p[i]=='0'&&p[i+1]<='9'&&p[i+1]>='0')//讲数据为01.000.02.05这类型的排除
{
k=0;break;
}
else
sum=sum*10+p[i]-'0';
}
else
{
if(sum1>=3) //再次遇到点,先看点的个数是否够数了
{
k=0;
break;
}
else
{
if(sum>255)//在此判断每段的数值是否满足题意
{
k=0;
break;
}
else
{
sum=0; //满足题意的话数据全部清零
sum1++;
}
}
}
i++;
}
if(sum>255) k=0;
if(sum1<3) k=0;
if(k==1) printf("YES\n");
else printf("NO\n");
}
else
printf("NO\n");
}
return 0;
}