1556: 网址
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 16 Solved: 4
[Submit][Status][Web Board]
Description
我们平时上网总是需要输入网址的,可是,这里有一堆的字符串,请判断这是不是一个网址。
网址的规则如下:
1、网址由协议、域名、端口、路径和文件构成,一个网址的实例:http://openoj.awaysoft.com:80/JudgeOnline/index.html
2、协议,以协议名+://构成,如1中的http://,这里限定使用ftp和http两种协议,这部分可以省略。
3、域名由字母、数字、下划线、减号以及小数点组成,小数点前后必须有数字或字母或下划线或减号,如1中的openoj.awaysoft.com,这部分必须有。域名需要以.com、.cn、.org、.net结束。
4、端口,在域名后加:跟一个数字,如文中的:80,这部分可以省略。
5、路径,由字母、数字、下划线、减号、斜杠构成,斜杠前后必须有字母、数字、下划线或者减号,如文中的/JudgeOnline/,这部分可以省略
6、文件,由字母、数字、下划线、减号、点构成,点前后必须有字母、数字、下划线或者减号,如文中的index.html,这部分可以省略
注意:
1、路径必须以/开头,如果没有路径,那么文件前必须有/。
2、除了协议后面的/,不得有两个//连续。
以下是合法的网址:
http://www.baidu.com
www.baidu.com/a
www.baidu.com/a/a.a
www.baidu.com/a/
http://www.baidu.com:800/a
www.baidu.com:12
Input
第一行为N组测试数据
以下N行,每行一个字符串。
Output
输出N行,如果是合法网址,输出
字符串:YES
否则输出
字符串:NO
Sample Input
2
http://openoj.awaysoft.com:80/JudgeOnline/index.html
http://openoj.awaysoft..com:80/JudgeOnline/index.html
Sample Output
http://openoj.awaysoft.com:80/JudgeOnline/index.html:YES
http://openoj.awaysoft..com:80/JudgeOnline/index.html:NO
模拟题,不解释了,超级恶心,没有用正则表达式写,代码很长,不过效果貌似不错,判断时间很短。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
bool right( char *p );
bool legal( char c )
{
if( c=='_'|| c== '-'|| c>='a'&& c<= 'z'|| c>= '0'&& c<= '9'|| c>= 'A'&& c<= 'Z' )
{
return true;
}
else
{
return false;
}
}
bool istype( char *p )
{
int flag= 0;
for( char *i= p+ 1; *i!= '\0'; ++i )
{
if( legal( *i ) )
{
flag= 1;
continue;
}
else
{
return false;
}
}
if( flag )
{
return true;
}
else
{
return false; // www.baidu.com/a.
}
}
bool iscom( char *p ) // žÃº¯Êý²»œøÐÐÐøÅжš
{
char cpy[10000];
memset( cpy, 0, sizeof( cpy ) );
strcpy( cpy, p );
if( *( cpy+ 4 )!= '/'&& *( cpy+ 4 )!= ':'&& *( cpy+ 4 )!= '\0' )
{
return false;
}
*( cpy+ 4 )= '\0';
if( strcmp( cpy, ".com" )!= 0&& strcmp( cpy, ".org" )!= 0&& strcmp( cpy, ".net" )!= 0 )
{
if( *( cpy+ 3 )!= '/'&& *( cpy+ 3 )!= ':'&& *( cpy+ 3 )!= '\0' )
{
return false;
}
*( cpy+ 3 )= '\0';
if( strcmp( cpy, ".cn" )!= 0 )
{
return false;
}
else
{
return true;
}
}
else
{
return true;
}
}
bool isfile( char *p, char *last )
{
if( last&& !iscom( last ) )
{
return false;
}
int flag= 0; // ŒÇÂŒ'/'ºóÊÇ·ñÓÐ×Ö·û
for( char *i= p+ 1; *i!= '\0'; ++i )
{
if( legal( *i ) )
{
flag= 1;
continue;
}
else if( *i== '/' )
{
if( flag )
{
return isfile( i, NULL );
}
else
{
return false; // www.baidu.com//
}
}
else if( *i== '.' )
{
if( flag )
{
return istype( i );
}
else
{
return false;
}
}
else
{
return false;
}
}
return true; // www.baidu.com/
}
bool isport( char *p, char *last )
{
if( last&& !iscom( last ) )
{
return false;
}
int flag= 0;
for( char *i= p+ 1; *i!= '\0'; ++i )
{
if( *i>= '0'&& *i<= '9' )
{
flag= 1;
continue;
}
if( *i== '/' )
{
if( flag )
{
return isfile( i, NULL );
}
else
{
return false; // www.baidu.com:/a
}
}
else
{
return false;
}
}
if( flag )
{
return true;
}
else
{
return false;
}
}
bool isbody( char *p, char *last )
{
int flag= 0;
for( char *i= p+ 1; *i!= '\0'; ++i )
{
if( legal( *i ) )
{
flag= 1;
continue;
}
else if( *i== '.' )
{
if( flag )
{
return isbody( i, p );
}
else
{
return false;
}
}
else if( *i== ':' )
{
return isport( i, p );
}
else if( *i== '/' )
{
if( flag )
{
return isfile( i, p );
}
else
{
return false;
}
}
else
{
return false;
}
} // Ìø³öÑ»·ËµÃ÷¿ÉÄÜÒÔ .xxx œá⣬ŽËʱֻÐèÅжšÊÇ·ñΪºó׺ŒŽ¿É
if( iscom( p ) )
{
return true;
}
else
{
return false;
}
}
bool isfttp( char *url )
{
char cpy[10000];
strcpy( cpy, url );
if( *cpy== 'h' )
{
*( cpy+ 7 )= '\0';
if( strcmp( cpy, "http://" )!= 0 )
{
return false;
}
else
{
return isbody( url+ 6, NULL );
}
}
if( *cpy== 'f' )
{
*( cpy+ 6 )= '\0';
if( strcmp( cpy, "ftp://" )!= 0 )
{
return false;
}
else
{
return isbody( url+ 5, NULL );
}
}
}
bool yes( char *url )
{
if( *url=='h'|| *url== 'f' )
{
return isfttp( url );
}
else if( legal( *url ) )
{
return isbody( url- 1, NULL );
}
else
{
return false;
}
}
int main( )
{
char url[10000];
int T;
scanf( "%d", &T );
while( T-- )
{
scanf( "%s", url );
printf( yes( url )? "%s:YES\n": "%s:NO\n", url );
}
return 0;
}