HUT-1556 网址

1556: 网址

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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;

}
posted @ 2011-08-01 22:24  沐阳  阅读(534)  评论(0编辑  收藏  举报