描述
现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。
现在需要你用程序来判断IP是否合法。
注意本题有多组样例输入。
输入描述:
输入一个ip地址,保证是xx.xx.xx.xx的形式(xx为整数)
输出描述:
返回判断的结果YES or NO
示例1
输入:
10.138 .15.1
255.0 .0.255
255.255 .255.1000
复制
输出:
YES
YES
NO
# include <stdio.h>
# if 0
# define dbg printf
# else
# define dbg
# endif
int main ( void )
{
char a[ 64 ] = { 0 } ;
int b[ 32 ] = { 0 } ;
int c[ 4 ] = { 0 } ;
int i, j;
int cnt;
int flag;
j = 0 ;
while ( scanf ( "%s" , a) != EOF )
{
flag = 0 ;
cnt = 0 ;
for ( i= 0 ; i< strlen ( a) ; i++ )
{
if ( a[ i] == '.' )
{
cnt++ ;
}
}
if ( cnt != 3 )
{
b[ j++ ] = 1 ;
continue ;
}
for ( i= 0 ; a[ i] != '.' ; i++ )
{
c[ 0 ] = c[ 0 ] * 10 ;
c[ 0 ] = c[ 0 ] + a[ i] - '0' ;
}
for ( ++ i; a[ i] != '.' ; i++ )
{
c[ 1 ] = c[ 1 ] * 10 ;
c[ 1 ] = c[ 1 ] + a[ i] - '0' ;
}
for ( ++ i; a[ i] != '.' ; i++ )
{
c[ 2 ] = c[ 2 ] * 10 ;
c[ 2 ] = c[ 2 ] + a[ i] - '0' ;
}
for ( ++ i; a[ i] != 0 ; i++ )
{
c[ 3 ] = c[ 3 ] * 10 ;
c[ 3 ] = c[ 3 ] + a[ i] - '0' ;
}
for ( i= 0 ; i< 4 ; i++ )
{
dbg ( "(%d):c[%d]=%d\n" , __LINE__ , i, c[ i] ) ;
}
for ( i= 0 ; i< 4 ; i++ )
{
if ( c[ i] < 0 || c[ i] > 255 )
{
flag = 1 ;
break ;
}
}
if ( flag == 1 )
{
b[ j++ ] = 1 ;
}
else
{
b[ j++ ] = 0 ;
}
memset ( c, 0 , sizeof ( c) ) ;
memset ( a, 0 , sizeof ( a) ) ;
}
for ( i= 0 ; i< j; i++ )
{
if ( b[ i] == 1 )
{
printf ( "NO\n" ) ;
}
else
{
printf ( "YES\n" ) ;
}
}
return 0 ;
}