HUT-1556 网址
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; }