#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXN 1024+10
char url [MAXN] = "http://www.google.com:80/wiki/Search?search=train&go=Go#steammachine"; int main()
{
const char *parseptr1;
const char *parseptr2;
int len;
int i;
parseptr2 = url;
parseptr1 = strchr(parseptr2, ':');
if ( NULL == parseptr1 ) {
printf("URL错误!\n");
return ;
}
len = parseptr1 - parseptr2;
for ( i = ; i < len; i++ ) {
if ( !isalpha(parseptr2[i]) ) {
printf("URL错误!\n");
return ;
}
}
printf("protocol: ");
for(i=;i<len;i++)
printf("%c",parseptr2[i]);
printf("\n");//解析协议
parseptr1++;
parseptr2 = parseptr1;
for ( i = ; i < ; i++ ) {
if ( '/' != *parseptr2 ) {
printf("URL错误!\n");
return ;
}
parseptr2++;
}
parseptr1 = strchr(parseptr2, ':');
if ( NULL == parseptr1 )//判断有无端口号
{
parseptr1 = strchr(parseptr2, '/');
if ( NULL == parseptr1 ) {
printf("URL错误!\n");
return ;}
len = parseptr1 - parseptr2;
printf("host: ");
for(i=;i<len;i++)
printf("%c",parseptr2[i]);
printf("\n");//解析主机
}
else{
len = parseptr1 - parseptr2;
printf("host: ");
for(i=;i<len;i++)
printf("%c",parseptr2[i]);
printf("\n");
parseptr1++;
parseptr2 = parseptr1;
parseptr1 = strchr(parseptr2, '/');
if ( NULL == parseptr1 ) {
printf("URL错误!\n");
return ;
}
len = parseptr1 - parseptr2;
printf("port: ");
for(i=;i<len;i++)
printf("%d",(parseptr2[i]-));
printf("\n");//解析端口
}
parseptr1++;
parseptr2 = parseptr1;
while ( '\0' != *parseptr1 && '?' != *parseptr1 && '#' != *parseptr1 ) {
parseptr1++;
}
len = parseptr1 - parseptr2;
printf("path: ");
for(i=;i<len;i++)
printf("%c",parseptr2[i]);
printf("\n");//解析路径
parseptr2=parseptr1;
if ( '?' == *parseptr1 ) {
parseptr2++;
parseptr1 = parseptr2;
while ( '\0' != *parseptr1 && '#' != *parseptr1 ) {
parseptr1++;
}
len = parseptr1 - parseptr2;
printf("query: ");
for(i=;i<len;i++)
printf("%c",parseptr2[i]);//判断有无询问并解析
printf("\n");
}
parseptr2=parseptr1;
if ( '#' == *parseptr1 ) {
parseptr2++;
parseptr1 = parseptr2;
while ( '\0' != *parseptr1 ) {
parseptr1++;
}
len = parseptr1 - parseptr2;
printf("fragment: ");
for(i=;i<len;i++)
printf("%c",parseptr2[i]);
printf("\n");//判断有无片段并解析 }
}

C语言练习,可以解析协议,主机,路径,询问,片段等的更多相关文章

  1. 查看DNS主机名解析的主机IP并向DNSserver进行DNS域名解析

    一.查看DNS主机名解析的主机IP host 命令 用途 把一个主机名解析到一个网际地址或把一个网际地址解析到一个主机名. 语法 host [-n [ -a ] [ -c Class] [ -d ] ...

  2. Newtonsoft.Json 自定义 解析协议

    在开发web api的时候 遇到一个要把string未赋值默认为null的情况改成默认为空字符串的需求 这种情况就需要自定义json序列话的 解析协议了 Newtonsoft.Json默认的解析协议是 ...

  3. C语言文件操作解析(五)之EOF解析(转载)

      C语言文件操作解析(五)之EOF解析 在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符.但是很多时候对这个理解并不是很清楚,导致在写代码的时候经常出错,特 ...

  4. 【转】C语言文件操作解析(三)

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  5. [webpack]--webpack 如何解析代码模块路径

    前言 webpack是如何解析代码模块路径 webpack 中有一个很关键的模块 enhanced-resolve 就是处理依赖模块路径的解析的,这个模块可以说是 Node.js 那一套模块路径解析的 ...

  6. iOS网络编程解析协议二:XML数据传输解析

    XML两种解析方式,一种是SAX,NSXMLParser是SAX方法解析,另一种是DOM(Document Object Model); 区别: SAX: 只能读,不能修改,只能顺序访问,适合解析大型 ...

  7. iOS:网络编程解析协议一:HTTP超文本传输协议

    HTTP传输数据有四种方式:Get方式.Post方式.同步请求方式.异步请求方式.具体的介绍,前面已经有过系统的讲解,这次主要进行具体的举. 说明:同步和异步请求方式在创建链接对象和创建请求对象时,用 ...

  8. surging 微服务引擎 -协议主机的Behavior特性

    1.前言 因为工作的关系,最近很少更新surging,因为surging 一直处在不温不火的状态,而自己每天利用业余时间进行完善,每天都是疲惫的状态,还要应付新手的提问,曾经一度想放弃,但是有些人劝说 ...

  9. tarjan解决路径询问问题

    好久没更新了,就更一篇普及组内容好了. 首先我们考虑如何用tarjan离线求出lca,伪代码大致如下: def tarjan(x): 将x标记为已访问 for c in x的孩子: tarjan(c) ...

随机推荐

  1. visual studio 使用技巧——vs技巧

    vs(visual studio)使用技巧: 1,vs有多个断点时,调试时,如果不想命中断点,可以在调试菜单下禁用所有断点: 2,高版本(比如vs2015)的vs支持javascript中使用F12转 ...

  2. CQRS的全称是Command Query Responsibility Segregation

    CQRS时,我们在讨论些神马?   当我写下这个标题的时候,我就有些后悔了,题目有点大,不太好控制.但我还是打算尝试一下,通过这篇内容来说清楚CQRS模式,以及和这个模式关联的其它东西.希望我能说得清 ...

  3. Spring如何给静态变量注入值

    Common.java是一个工具类. Spring无法直接给静态变量注入值,因为静态变量不属于对象,只属于类,也就是说在类被加载字节码的时候变量已经初始化了,也就是给该变量分配内存了,导致spring ...

  4. django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist

    Enrollment has no customer.

  5. go语言-关于文件的操作和解释

    一.文件存放的位置 bin文件:存放编译后的二进制文件 pkg文件:存放编译后的库文件 src文件:存放源代码文件 二.运行文件的常用命令 两种运行区别(直接运行和编译后运行) 1.编译生成可执行文件 ...

  6. guava字符串工具 Strings 校验补全 转换null和""

    public class StringsTest { public static void main(String args[]){ //1.补右全(Strings.padEnd方法) String ...

  7. 利用 BackgroundService 固定时间间隔执行某动作

    继承 BackgroundService 类: 为什么会写这个东西呢?本人在写消息队列的时候思考过一个问题——比如,每5秒从队列里面取一条消息(一条消息里面又包含了1000条数据),要把这1000条数 ...

  8. jQuery相关方法4-----元素创建和移除

    一.创建添加元素 父元素.append(子元素)-----被动追加创建 子元素.appendTo(父元素)-----主动追加创建 <script src="http://libs.ba ...

  9. luogu P3386 【模板】二分图匹配

    二次联通门 : luogu P3386 [模板]二分图匹配 /* luogu P3386 [模板]二分图匹配 最大流 设置源点,汇点,连到每条边上 跑一边最大流即可 */ #include <i ...

  10. linux系列(七):mv命令

    1.命令格式: mv [选项] 源文件或目录 目标文件或目录 2.命令功能: Linux mv命令用来为文件或目录改名.或将文件或目录移入其它位置. 3.命令参数: -b :若需覆盖文件,则覆盖前先行 ...