zoukankan      html  css  js  c++  java
  • HUT1556 网址

    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;
    
    }
    
  • 相关阅读:
    【ADO.NET基础-GridView】GridView的编辑、更新、取消、删除以及相关基础操作代码
    【ADO.NET基础-Session】Session的基本应用
    【ADO.NET基础-数据加密】第一篇(加密解密篇)
    【ADO.NET基础知识】SqlConnection、command、DataSet 、DataTable、dataAdapter
    3、Flask实战第3天:url_for使用
    2、Flask实战第2天:URL传参
    1、Flask实战第1天:第一个Flask程序
    第5天-表单
    第4天-表格
    第3天-DIV+CSS布局
  • 原文地址:https://www.cnblogs.com/Lyush/p/2124334.html
Copyright © 2011-2022 走看看