http://blog.csdn.net/cuishumao/article/details/10284463

一 说明
(1)应用情况:比如基于socket来实现http协议等,这时候就需要解析URL。
(2)为了移植性,没有用非标准C库windows下的StrDup(linux下为strdup),用自己编写的dup_str。
(3)编译环境:windows ,visual studio2010
二 URL的格式:
(协议)://(主机名):(端口号) / (文件路径)/(文件名) 
  例如:http://zj.qq.com/a/20130824/002507.htm#p=8
      http://www.itpub.net/kwrss/201211/wangzhiduankou.shtml
三 实现

  1. #include <stdio.h>     //printf
  2. #include <string.h>    //strchr strncmp ,memcpy
  3. #include <malloc.h>    //malloc free
  4. #include <stdlib.h>    //atoi
  5. //将source开始空间的以NULL结尾的字符拷贝到dest中
  6. //返回的指针需要free
  7. char*dup_str(const char*source)
  8. {
  9. if(source==NULL)
  10. return  NULL;
  11. int len = strlen(source);
  12. char *dest = (char*)malloc(len+1);
  13. memcpy(dest,source,len+1);
  14. return dest;
  15. }
  16. //函数功能:解析URL
  17. //参数:host带回主机字符串,protocl协议,port端口,abs_path带回绝对路径
  18. //使用完注意释放host和abs_path在堆上分配的内存
  19. //备注:(1)先取到URL的一份拷贝,方面将该字符串截成几段,分别处理;
  20. //      (2)用了指针引用,也可以使用二重指针来解决参数带回值的问题
  21. void parse_URL(const char*URL,const char*protocl,char*&host,unsigned int &port,char*&abs_path)
  22. {
  23. if(URL == NULL)
  24. return ;
  25. char *url_dup = dup_str(URL);
  26. char *p_slash = NULL;//主机后第一个斜杠的位置
  27. char *p_colon = NULL;//主机后第一个冒号的位置
  28. char *start = 0;    //记录www开始的位置
  29. if(strncmp(url_dup,protocl,strlen(protocl))==0)
  30. {
  31. start = url_dup+strlen(protocl)+3;
  32. p_slash = strchr(start,'/');
  33. if(p_slash != NULL)
  34. {
  35. abs_path= dup_str(p_slash);
  36. *p_slash = '\0';
  37. }
  38. else
  39. {
  40. abs_path= dup_str("/");
  41. }
  42. p_colon = strchr(start,':');
  43. if(p_colon != NULL)
  44. {
  45. port = atoi(p_colon+1);
  46. *p_colon = '\0';
  47. }
  48. else
  49. port = 8080;//没有的话取默认的8080端口
  50. }
  51. host = dup_str(start);
  52. }
  53. if(url_dup != NULL)
  54. {
  55. free(url_dup);
  56. url_dup = NULL;
  57. }
  58. }
  59. int main()
  60. {
  61. //这是一个伪造的地址,用于测试
  62. //char *URL = "http://www.xyz2013.com";
  63. //char *URL = "ftp://www.xyz2013.com:8080";
  64. char *URL = "https://www.xyz2013.com:1324/My/5201449.shtml";
  65. char*abs_path = NULL;
  66. char*host = NULL;
  67. unsigned int port;
  68. parse_URL(URL,"https",host,port,abs_path);
  69. printf("主机地址:%s\n",host);
  70. printf("端口号:%d\n",port);
  71. printf("绝对路径:%s\n",abs_path);
  72. //需要释放host,abs_path
  73. if(host!=NULL)
  74. {
  75. free(host);
  76. host = NULL;
  77. }
  78. if(abs_path!=NULL)
  79. {
  80. free(abs_path);
  81. abs_path=NULL;
  82. }
  83. getchar();
  84. }

结果:

[转]URL的解析,C语言实现的更多相关文章

  1. URL的解析,C语言实现

    源: URL的解析,C语言实现 c语言实现urlencode和decode

  2. 巨蟒python全栈开发django4:url反向解析图解&&模板渲染

    第一部分: 1.(1)知识点回顾: django回顾: ()下载安装 输入网址,a,form表单get post,爬虫 (请求)==>django项目服务端的url(r"index/& ...

  3. python 之 Django框架(路由系统、include、命名URL和URL反向解析、命名空间模式)

    12.36 Django的路由系统 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名) ...

  4. phpcms V9 MVC模式 与 URL访问解析

    [1]URL访问解析 观察访问网页时的网址,可以得出模块访问方法,如下示例: http://www.abcd.com.cn/phpcms/index.php?m=content&c=index ...

  5. atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  6. phpcms(1)phpcms V9 MVC模式 与 URL访问解析(转)

    [1]URL访问解析 观察访问网页时的网址,可以得出模块访问方法,如下示例: http://www.abcd.com.cn/phpcms/index.php?m=content&c=index ...

  7. django的url反向解析

    目的:防止页面中url地址改变,其他与这个URL地址有关联的都要改,减少耦合度 使用:主要分为在html中和视图函数中的使用 HTML中的使用: 如果我们在项目的url文件中通过include导入了应 ...

  8. Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式

    Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...

  9. Django url反向解析与路由分发名称空间

    url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...

  10. rails中path、url路径解析,routes信息,form_for剖析,link_to示例,路由实例说明

    原创,转载请注明http://www.cnblogs.com/juandx/p/3963023.html  rails中path.url路径解析,routes信息,form_for剖析,link_to ...

随机推荐

  1. C语言之break和continue

    一 break 和 continue 的介绍 break: 1).跳出当前所在的switch语句(tips:可查看前面 switch 部分)   2).跳出当前所在的循环 continue: 结束本次 ...

  2. LaTeX入门教程

    LaTeX(LATEX,音译"拉泰赫")是一种基于ΤΕΧ的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在20世纪80年代初期开发,利用这种格式,即使使用 ...

  3. RHEL账号总结一:账号的分类

    账号是一种用来记录单个用户或者多个用户的数据.RHEL中每一个合法的用户都必须拥有账号,才能使用RHEL. 在RHEL上的账号可以分为两类: 用户账号:用来存储单一用户的数据,你也可以使用一个用户账号 ...

  4. 【转】【WebService】.NET C# 创建WebService服务

    Web service是一个基于可编程的web的应用程序,用于开发分布式的互操作的应用程序,也是一种web服务 WebService的特性有以下几点: 1.使用XML(标准通用标记语言)来作为数据交互 ...

  5. 遍历HashMap的最佳方式

    public static void printMap(Map mp) { Iterator it = mp.entrySet().iterator(); while (it.hasNext()) { ...

  6. 【百科】CLEO 逐推縮寫命名法

    一. 適用場合 1. C# Windows Forms 等窗體開發技術的控件名稱縮寫: 2. 強行縮寫駝峰命名法(Camel-Case).帕斯卡命名法的英文的時候: 二. 命名規則 1. 首字母大寫: ...

  7. Ubuntu 16.04 Django安装和配置

    之前有安装和配置过,换了台电脑,再安装和配置,忽然发现差不多都忘记了,这里记录下已备之后查阅. sudo apt-get install python-pip sudo apt-get install ...

  8. js函数的可变参数

    //对于js的可变参数的清空,在定义函数式不需要写上参数, 在函数内部使用argument对象可以 直接获取参数个数等信息 //在调用函数式可以传递任意个数的参数 function text(){ v ...

  9. Vim插件之Command-T使用问题

    最近在使用vim插件CommandT时出现问题其实就是vim没有支持ruby,不过google之后找到了解决方法,老外的态度还是很让人敬佩的,度娘搜索的结果太让人呕心了.. 贴下,以后再次遇到解决. ...

  10. GridControl/GridView的分组操作

    今天在模块编写中碰到了对表格的分组,特意在这里把它记录下来. 一.背景:Dev14.1.3,GridControl,.NET4.0+C# 二.过程 1.GridControl设计 一共添加4列:在下面 ...