打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C语言URL解析器(代码分享)

         C语言URL解析器(代码分享)

                 By qianghaohao(Xqiang)


       本程序可以解析出URL中每个字段的值然后存入结构体
 中.也可以调用提供的API只获取需要的部分.
       本URL解析器代码来自https://github.com/jwerle/url.h
  在此基础上进行了大量的修改,修复了很多bug.总体思路
 没有改变,就是把很多细节改了下,现在可以正常使用了.
       -->可能还存在bug,如果网友发现了可以及时指正.

     感受:花了一天多的时间修复,充分地感受到了IDE对编程
的效率的影响,一个很奇葩的越界导致的问题结果调了半天
没找到问题。。。结果人家五分钟搞定。。。
   话不多说,直接上源代码:
  接口文件:url_parser.h:
  1. #ifndef URL_PARSER  
  2. #define URL_PARSER  
  3.   
  4. /** 
  5.  * Dependencies 
  6.  */  
  7.   
  8. #include <stdlib.h>  
  9. #include <stdio.h>  
  10. #include <stdbool.h>  
  11. #include <string.h>  
  12.   
  13.   
  14. /** 
  15.  * url.h version 
  16.  */  
  17.   
  18. #define URL_VERSION 0.0.2  
  19.   
  20.   
  21. /** 
  22.  * Max length of a url protocol scheme 
  23.  */  
  24.   
  25. #define URL_PROTOCOL_MAX_LENGTH 16  
  26.   
  27.   
  28. /** 
  29.  * Max length of a url host part 
  30.  */  
  31.   
  32. #define URL_HOSTNAME_MAX_LENGTH 128  
  33.   
  34.   
  35. /** 
  36.  * Max length of a url tld part 
  37.  */  
  38.   
  39. #define URL_TLD_MAX_LENGTH 16  
  40.   
  41.   
  42. /** 
  43.  * Max length of a url auth part 
  44.  */  
  45.   
  46. #define URL_AUTH_MAX_LENGTH 32  
  47.   
  48. /** 
  49.  * `url_data` struct that defines parts 
  50.  * of a parsed URL such as host and protocol 
  51.  */  
  52.   
  53.   
  54. #define URL_MAX_LENGTH 1024  
  55.   
  56. //  url结构信息  
  57. typedef struct url_data {  
  58.   char *href;  
  59.   char *protocol;  
  60.   char *host;  
  61.   char *auth;  
  62.   char *hostname;  
  63.   char *pathname;  
  64.   char *search;  
  65.   char *path;  
  66.   char *hash;  
  67.   char *query;  
  68.   char *port;  
  69. } url_data_t;  
  70.   
  71.   
  72. // prototype  
  73.   
  74. /** 
  75.  * Parses a url into parts and returns 
  76.  * a `url_data_t *` pointer 
  77.  */  
  78.   
  79. url_data_t *  
  80. url_parse (char *url);  
  81.   
  82. char *  
  83. url_get_protocol (char *url);  
  84.   
  85. char *  
  86. url_get_auth (char *url);  
  87.   
  88. char *  
  89. url_get_hostname (char *url);  
  90.   
  91. char *  
  92. url_get_host (char *url);  
  93.   
  94. char *  
  95. url_get_pathname (char *url);  
  96.   
  97. char *  
  98. url_get_path (char *url);  
  99.   
  100. char *  
  101. url_get_search (char *url);  
  102.   
  103. char *  
  104. url_get_query (char *url);  
  105.   
  106. char *  
  107. url_get_hash (char *url);  
  108.   
  109. char *  
  110. url_get_port (char *url);  
  111.   
  112. void  
  113. url_free (url_data_t *data);  
  114.   
  115. bool  
  116. url_is_protocol (char *str);  
  117.   
  118. bool  
  119. url_is_ssh (char *str);  
  120.   
  121. void  
  122. url_inspect (char *url);  
  123.   
  124. void  
  125. url_data_inspect (url_data_t *data);  
  126.   
  127. #endif  

    实现文件:url_parser.c:
  1. #include "url_parser.h"  
  2.   
  3. /** 
  4.  * URI Schemes 
  5.  * http://en.wikipedia.org/wiki/URI_scheme 
  6.  */  
  7. //  URL协议头表:用来判断解析出来的协议是否在此表中  
  8. char *URL_SCHEMES[] = {  
  9.   // official IANA registered schemes  
  10.   "aaa", "aaas", "about", "acap", "acct", "adiumxtra", "afp", "afs", "aim", "apt", "attachment", "aw",  
  11.   "beshare", "bitcoin", "bolo", "callto", "cap", "chrome", "crome-extension", "com-evenbrite-attendee",  
  12.   "cid", "coap", "coaps","content", "crid", "cvs", "data", "dav", "dict", "lna-playsingle", "dln-playcontainer",  
  13.   "dns", "dtn", "dvb", "ed2k", "facetime", "fax", "feed", "file", "finger", "fish","ftp", "geo", "gg","git",  
  14.   "gizmoproject", "go", "gopher", "gtalk", "h323", "hcp", "http", "https", "iax", "icap", "icon","im",  
  15.   "imap", "info", "ipn", "ipp", "irc", "irc6", "ircs", "iris", "iris.beep", "iris.xpc", "iris.xpcs","iris.lws",  
  16.   "itms", "jabber", "jar", "jms", "keyparc", "lastfm", "ldap", "ldaps", "magnet", "mailserver","mailto",  
  17.   "maps", "market", "message", "mid", "mms", "modem", "ms-help", "mssettings-power", "msnim", "msrp",  
  18.   "msrps", "mtqp", "mumble", "mupdate", "mvn", "news", "nfs", "ni", "nih", "nntp", "notes","oid",  
  19.   "paquelocktoken", "pack", "palm", "paparazzi", "pkcs11", "platform", "pop", "pres", "prospero", "proxy",  
  20.   "psyc","query", "reload", "res", "resource", "rmi", "rsync", "rtmp","rtsp",  "secondlife", "service","session",  
  21.   "sftp", "sgn", "shttp", "sieve", "sip", "sips", "skype", "smb", "sms", "snews", "snmp", "soap.beep","soap.beeps",  
  22.   "soldat", "spotify", "ssh", "steam", "svn", "tag", "teamspeak", "tel", "telnet", "tftp", "things","thismessage",  
  23.   "tn3270", "tip", "tv", "udp", "unreal", "urn", "ut2004", "vemmi","ventrilo", "videotex", "view-source", "wais","webcal",  
  24.   "ws", "wss", "wtai", "wyciwyg", "xcon", "xcon-userid", "xfire","xmlrpc.beep",  "xmlrpc.beeps", "xmpp", "xri","ymsgr",  
  25.   
  26.   // unofficial schemes  
  27.   "javascript", "jdbc", "doi"  
  28. };  
  29.   
  30.   
  31. char *  
  32. m_strdup (const char *str) {  
  33.   int n = strlen(str) + 1;  
  34.   char *dup = malloc(n);  
  35.   if (dup) strcpy(dup, str);  
  36.   return dup;  
  37. }  
  38.   
  39. static char *  
  40. get_part (char *url, const char *format, int l) {  
  41.   bool has = false;  
  42.   
  43.   char *tmp = malloc(URL_MAX_LENGTH * sizeof(char));  
  44.   memset(tmp, 0, URL_MAX_LENGTH * sizeof(char));  
  45.   char *fmt_url = m_strdup(url);  
  46.   char *ret = NULL;  
  47.   if (!tmp || !fmt_url)  
  48.     return NULL;  
  49.   
  50.   strcpy(tmp, "");  
  51.   strcpy(fmt_url, "");  
  52.   
  53.   // move pointer exactly the amount  
  54.   // of characters in the `prototcol` char  
  55.   // plus 3 characters that represent the `://`  
  56.   // part of the url  
  57.   fmt_url = fmt_url + l;  
  58.   sscanf(fmt_url, format, tmp);  
  59.   
  60.  // if (0 != strcmp(tmp, tmp_url)) {  
  61.  if (0 != strcmp(tmp, fmt_url)) {  
  62.     has = true;  
  63.     ret = m_strdup(tmp);  
  64.   }  
  65.   
  66.   // descrement pointer to original  
  67.   // position so it can be free'd  
  68.   fmt_url = fmt_url - l;  
  69.   free(tmp);  
  70.   free(fmt_url);  
  71.   if (!has) {  
  72.     free(ret);  
  73.     return NULL;  
  74.   } else {  
  75.     return ret;  
  76.   }  
  77. }  
  78.   
  79. /************* 解析URL各部分到url_data_t结构体 *************/  
  80. url_data_t *  
  81. url_parse (char *url) {  
  82.   url_data_t *data = malloc(sizeof(url_data_t));  
  83.   if (!data) return NULL;  
  84.   
  85.   data->href = url;  
  86.   char *tmp;  
  87.   char *tmp_url = m_strdup(url);  
  88.   bool is_ssh = false;  
  89.   
  90.   /************ 解析协议头 ***********/  
  91.   char *protocol = url_get_protocol(tmp_url);  
  92.   if (!protocol) return NULL;  
  93.   // length of protocol plus ://  
  94.   int protocol_len = (int) strlen(protocol) + 3;  
  95.   data->protocol = protocol;  
  96.   
  97.   is_ssh = url_is_ssh(protocol);  
  98.   
  99.   /************ 解析用户名 ***********/  
  100.   char *auth = NULL;  
  101.   int auth_len = 0;  
  102.   if ((tmp = strstr(tmp_url, "@"))) {  
  103.     auth = get_part(tmp_url, "%[^@]", protocol_len);  
  104.     auth_len = strlen(auth);  
  105.     if (auth) auth_len++;  
  106.   }  
  107.   
  108.   data->auth = auth;  
  109.   char *hostname = NULL;  
  110.   
  111.   /************ 解析主机名(包括端口号) ***********/  
  112.   hostname = (is_ssh)  
  113.                get_part(tmp_url, "%[^:]", protocol_len + auth_len)  
  114.               : get_part(tmp_url, "%[^/]", protocol_len + auth_len);  
  115.   
  116.   if (!hostname) return NULL;  
  117.   int hostname_len = (int) strlen(hostname);  
  118.   char *tmp_hostname = m_strdup(hostname);  
  119.   data->hostname = hostname;  
  120.   
  121.   /************ 解析主机名 ***********/  
  122.   char *host = malloc(strlen(tmp_hostname) * sizeof(char));  
  123.   memset(host, 0, strlen(tmp_hostname) * sizeof(char));  
  124.   sscanf(tmp_hostname, "%[^:]", host);  
  125.   if (!host) return NULL;  
  126.   int host_len = (int) strlen(host);  
  127.   data->host = host;  
  128.   
  129.   /************ 解析端口号 ***********/  
  130.   char *port = malloc(URL_PROTOCOL_MAX_LENGTH * (sizeof(char)));  
  131.   memset(port, 0, URL_PROTOCOL_MAX_LENGTH * (sizeof(char)));  
  132.   if (!port) return NULL;  
  133.   
  134.   tmp_hostname = tmp_hostname + (host_len + 1);  
  135.   sscanf(tmp_hostname, "%s", port);  
  136.   tmp_hostname = tmp_hostname - (host_len + 1);  
  137.   data->port = port;  
  138.   free(tmp_hostname);  
  139.   
  140.   /************ 解析完整路径名 ***********/  
  141.   char *tmp_path;  
  142.   tmp_path = (is_ssh)  
  143.                get_part(tmp_url, ":%s", protocol_len + auth_len + hostname_len)  
  144.               : get_part(tmp_url, "/%s", protocol_len + auth_len + hostname_len);  
  145.   
  146.   char *path = malloc(strlen(tmp_path) * sizeof(char) + 1);  
  147.   memset(path, 0, strlen(tmp_path) * sizeof(char) + 1);  
  148.   if (!path) return NULL;  
  149.   char *fmt = (is_ssh)? "%s" : "/%s";  
  150.   sprintf(path, fmt, tmp_path);  
  151.   data->path = path;  
  152.   free(tmp_path);  
  153.   
  154.   /************ 解析路径名(不包括参数) ***********/  
  155.   char *pathname = malloc(strlen(path) * sizeof(char) + 1);  
  156.   memset(pathname, 0, strlen(path) * sizeof(char) + 1);  
  157.   
  158.   if (!pathname) return NULL;  
  159.   tmp_path = m_strdup(path);  
  160.   sscanf(tmp_path, "%[^? | ^#]", pathname);  
  161.   int pathname_len = strlen(pathname);  
  162.   data->pathname = pathname;  
  163.   
  164.   /************* 解析搜索参数 ***********/  
  165.   char *search = malloc(URL_AUTH_MAX_LENGTH * sizeof(search));  
  166.   memset(search, 0, URL_AUTH_MAX_LENGTH * sizeof(search));  
  167.   if (!search) return NULL;  
  168.   tmp_path = tmp_path + pathname_len;  
  169.   sscanf(tmp_path, "%[^#]", search);  
  170.   tmp_path = tmp_path - pathname_len;  
  171.   data->search = search;  
  172.   int search_len = strlen(search);  
  173.   free(tmp_path);  
  174.   
  175.   /************* 解析查询参数 ***********/  
  176.   char *query = malloc(URL_AUTH_MAX_LENGTH * sizeof(char));  
  177.   memset(query, 0, URL_AUTH_MAX_LENGTH * sizeof(char));  
  178.   if (!query) return NULL;  
  179.   sscanf(data->search, "?%s", query);  
  180.   data->query = query;  
  181.   
  182.   /************* 解析hash值 ***********/  
  183.   char *hash = malloc(URL_AUTH_MAX_LENGTH * sizeof(char));  
  184.   memset(hash, 0, URL_AUTH_MAX_LENGTH * sizeof(char));  
  185.   if (!hash) return NULL;  
  186.   tmp_path = data->path + (pathname_len + search_len);  
  187.   sscanf(tmp_path, "%s", hash);  
  188.   tmp_path = data->path - (pathname_len + search_len);  
  189.   data->hash = hash;  
  190.   free(tmp_path);  
  191.   
  192.   return data;  
  193. }  
  194.   
  195. bool  
  196. url_is_protocol (char *str) {  
  197.   int count = sizeof(URL_SCHEMES) / sizeof(URL_SCHEMES[0]);  
  198.   
  199.   for (int i = 0; i < count; ++i) {  
  200.     if (0 == strcmp(URL_SCHEMES[i], str)) {  
  201.       return true;  
  202.     }  
  203.   }  
  204.   
  205.   return false;  
  206. }  
  207.   
  208. bool  
  209. url_is_ssh (char *str) {  
  210.   str = m_strdup(str);  
  211.   if (0 == strcmp(str, "ssh") ||  
  212.       0 == strcmp(str, "git")) {  
  213.     free(str);  
  214.     return true;  
  215.   }  
  216.   
  217.   return false;  
  218. }  
  219.   
  220. char *  
  221. url_get_protocol (char *url) {  
  222.   char *protocol = malloc(URL_PROTOCOL_MAX_LENGTH * sizeof(char));  
  223.   if (!protocol) return NULL;  
  224.   sscanf(url, "%[^://]", protocol);  
  225.   if (url_is_protocol(protocol)) return protocol;  
  226.   return NULL;  
  227. }  
  228.   
  229.   
  230. char *  
  231. url_get_auth (char *url) {  
  232.   char *protocol = url_get_protocol(url);  
  233.   if (!protocol) return NULL;  
  234.   int l = (int) strlen(protocol) + 3;  
  235.   return get_part(url, "%[^@]", l);  
  236. }  
  237.   
  238. char *  
  239. url_get_hostname (char *url) {  
  240.   int l = 3;  
  241.   char *protocol = url_get_protocol(url);  
  242.   char *tmp_protocol = m_strdup(protocol);  
  243.   char *auth = url_get_auth(url);  
  244.   
  245.   if (!protocol) return NULL;  
  246.   if (auth) l += strlen(auth) + 1; // add one @ symbol  
  247.   if (auth) free(auth);  
  248.   
  249.   l += (int) strlen(protocol);  
  250.   
  251.   free(protocol);  
  252.   
  253.   char * hostname = url_is_ssh(tmp_protocol)  
  254.             get_part(url, "%[^:]", l)  
  255.            : get_part(url, "%[^/]", l);  
  256.   free(tmp_protocol);  
  257.   return hostname;  
  258. }  
  259.   
  260. char *  
  261. url_get_host (char *url) {  
  262.   char *host = malloc(URL_HOSTNAME_MAX_LENGTH * sizeof(char));  
  263.   char *hostname = url_get_hostname(url);  
  264.   memset(host, 0, URL_HOSTNAME_MAX_LENGTH * sizeof(char));  
  265.   if (!host || !hostname) return NULL;  
  266.   
  267.   sscanf(hostname, "%[^:]", host);  
  268.   
  269.   free(hostname);  
  270.   
  271.   return host;  
  272. }  
  273.   
  274. char *  
  275. url_get_pathname (char *url) {  
  276.   char *path = url_get_path(url);  
  277.   char *pathname = malloc(URL_MAX_LENGTH * sizeof(char));  
  278.   memset(pathname, 0, URL_MAX_LENGTH * sizeof(char));  
  279.   if (!path || !pathname) return NULL;  
  280.   
  281.   sscanf(path, "%[^?]", pathname);  
  282.   
  283.   free(path);  
  284.   
  285.   return pathname;  
  286. }  
  287.   
  288. char *  
  289. url_get_path (char *url) {  
  290.   int l = 3;  
  291.   char *tmp_path;  
  292.   char *protocol = url_get_protocol(url);  
  293.   char *auth = url_get_auth(url);  
  294.   char *hostname = url_get_hostname(url);  
  295.   
  296.   
  297.   if (!protocol || !hostname)  
  298.     return NULL;  
  299.   
  300.   bool is_ssh = url_is_ssh(protocol);  
  301.   
  302.   l += (int) strlen(protocol) + (int) strlen(hostname);  
  303.   
  304.   if (auth) l+= (int) strlen(auth) +1; // @ symbol  
  305.   
  306.   tmp_path = (is_ssh)  
  307.                get_part(url, ":%s", l)  
  308.               : get_part(url, "/%s", l);  
  309.   
  310.   char *fmt = (is_ssh)? "%s" : "/%s";  
  311.   char *path = malloc(strlen(tmp_path) * sizeof(char) + 1);  
  312.   memset(path, 0, strlen(tmp_path) * sizeof(char) + 1);  
  313.   sprintf(path, fmt, tmp_path);  
  314.   
  315.   if (auth) free(auth);  
  316.   free(protocol);  
  317.   free(hostname);  
  318.   free(tmp_path);  
  319.   
  320.   return path;  
  321.   
  322. }  
  323.   
  324. char *  
  325. url_get_search (char *url) {  
  326.   char *path = url_get_path(url);  
  327.   char *pathname = url_get_pathname(url);  
  328.   char *search = malloc(URL_AUTH_MAX_LENGTH * sizeof(char));  
  329.   memset(search, 0, URL_AUTH_MAX_LENGTH * sizeof(char));  
  330.   if (!path || !search) return NULL;  
  331.   
  332.   path = path + (int)strlen(pathname);  
  333.   sscanf(path, "%[^#]", search);  
  334.   path = path - (int)strlen(pathname);  
  335.   
  336.   free(path);  
  337.   free(pathname);  
  338.   
  339.   return search;  
  340. }  
  341.   
  342. char *  
  343. url_get_query (char *url) {  
  344.   char *search = url_get_search(url);  
  345.   char *query = malloc(URL_AUTH_MAX_LENGTH * sizeof(char));  
  346.   memset(query, 0, URL_AUTH_MAX_LENGTH * sizeof(char));  
  347.   if (!search) return NULL;  
  348.   sscanf(search, "?%s", query);  
  349.   free(search);  
  350.   return query;  
  351. }  
  352.   
  353. char *  
  354. url_get_hash (char *url) {  
  355.   char *hash = malloc(URL_AUTH_MAX_LENGTH * sizeof(char));  
  356.   memset(hash, 0, URL_AUTH_MAX_LENGTH * sizeof(char));  
  357.   if (!hash) return NULL;  
  358.   
  359.   char *path = url_get_path(url);  
  360.   if (!path) return NULL;  
  361.   
  362.   char *pathname = url_get_pathname(url);  
  363.   if (!pathname) return NULL;  
  364.   char *search = url_get_search(url);  
  365.   
  366.   int pathname_len = (int) strlen(pathname);  
  367.   int search_len = (int) strlen(search);  
  368.   
  369.   path = path + (pathname_len + search_len);  
  370.   sscanf(path, "%s", hash);  
  371.   path = path - (pathname_len + search_len);  
  372.   free(pathname);  
  373.   free(path);  
  374.   if (search) free(search);  
  375.   
  376.   return hash;  
  377. }  
  378.   
  379. char *  
  380. url_get_port (char *url) {  
  381.   char *port = malloc(URL_PROTOCOL_MAX_LENGTH * sizeof(char));  
  382.   memset(port, 0, URL_PROTOCOL_MAX_LENGTH * sizeof(char));  
  383.   char *hostname = url_get_hostname(url);  
  384.   char *host = url_get_host(url);  
  385.   if (!port || !hostname) return NULL;  
  386.   
  387.   char *tmp_hostname = hostname;  
  388.   tmp_hostname = hostname + (strlen(host) + 1);  
  389.   sscanf(tmp_hostname, "%s", port);  
  390.   
  391.   free(hostname);  
  392.   return port;  
  393. }  
  394.   
  395. void  
  396. url_inspect (char *url) {  
  397.   url_data_inspect(url_parse(url));  
  398. }  
  399.   
  400.   
  401. void  
  402. url_data_inspect (url_data_t *data) {  
  403.   printf("#url =>\n");  
  404.   printf("    .href: \"%s\"\n",     data->href);  
  405.   printf("    .protocol: \"%s\"\n", data->protocol);  
  406.   printf("    .host: \"%s\"\n",     data->host);  
  407.   printf("    .auth: \"%s\"\n",     data->auth);  
  408.   printf("    .hostname: \"%s\"\n", data->hostname);  
  409.   printf("    .pathname: \"%s\"\n", data->pathname);  
  410.   printf("    .search: \"%s\"\n",   data->search);  
  411.   printf("    .path: \"%s\"\n",     data->path);  
  412.   printf("    .hash: \"%s\"\n",     data->hash);  
  413.   printf("    .query: \"%s\"\n",    data->query);  
  414.   printf("    .port: \"%s\"\n",     data->port);  
  415. }  
  416.   
  417. void  
  418. url_free (url_data_t *data) {  
  419.   if (!data) return;  
  420.   if (data->auth) free(data->auth);  
  421.   if (data->protocol) free(data->protocol);  
  422.   if (data->hostname) free(data->hostname);  
  423.   if (data->host) free(data->host);  
  424.   if (data->pathname) free(data->pathname);  
  425.   if (data->path) free(data->path);  
  426.   if (data->hash) free(data->hash);  
  427.   if (data->search) free(data->search);  
  428.   if (data->query) free(data->query);  
  429. }  

  使用用例:main.c:
  1. /************************************************************************* 
  2.     > File Name: main.c 
  3.     > Author: qianghaohao(Xqiang) 
  4.     > Program: url_parser 
  5.     > Readme: 本URL解析器代码来自https://github.com/jwerle/url.h 
  6.     >         在此基础上进行了大量的修改,修复了很多bug. 
  7.     >         总体思路没有改变,就是把很多细节改了下,现在可以正常使用了. 
  8.     >    -->可能还存在bug,如果网友发现了可以及时指正. 
  9.     > Platform: 可以跨平台使用 
  10.     > Created Time: 2016年06月11日 星期六 18时39分14秒 
  11.  ************************************************************************/  
  12.   
  13. #include"url_parser.h"  
  14. url_data_t *url_info = NULL;  
  15. int main(int argc, char **argv) {  
  16.     if (argc != 2) {  
  17.         fprintf(stderr, "usage:%s <url>", argv[0]);  
  18.         return -1;  
  19.     }  
  20.   
  21.      url_info = url_parse(argv[1]);  
  22.     if (NULL == url_info) {  
  23.         fprintf(stderr, "%s error...\n", argv[1]);  
  24.         return -1;  
  25.     }  
  26.     url_data_inspect(url_info);  
  27.   
  28.     //  测试用例:http://www.baidu.com:80/cig-bin/index.html?sdkfj#283sjkdf  
  29.     printf("\n================= API Demo ================\n");  
  30.   
  31.   
  32.     printf("herf:%s\n", argv[1]);  
  33.   
  34.     char *hostname = url_get_host(argv[1]);  
  35.     printf("hostname:%s\n", hostname);  
  36.   
  37.     char *path = url_get_path(argv[1]);  
  38.     printf("path:%s\n", path);  
  39.   
  40.     char *host = url_get_host(argv[1]);  
  41.     printf("host:%s\n", host);  
  42.   
  43.     char *proto = url_get_protocol(argv[1]);  
  44.     printf("protocol:%s\n", proto);  
  45.   
  46.     char *auth = url_get_auth(argv[1]);  
  47.     printf("auth:%s\n", auth);  
  48.   
  49.     char *search = url_get_search(argv[1]);  
  50.     printf("search:%s\n", search);  
  51.   
  52.     char *hash = url_get_hash(argv[1]);  
  53.     printf("hash:%s\n", hash);  
  54.   
  55.     char *query = url_get_query(argv[1]);  
  56.     printf("query:%s\n", query);  
  57.   
  58.     char *port = url_get_port(argv[1]);  
  59.     printf("port:%s\n", port);  
  60.     return 0;  
  61. }  
     运行结果:
 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
HTTP解析器llhttp的使用指南
字符串中去掉$符之间的内容
Debugging
怎么通过C语言自动生成MAC地址
歌词解析与Builder模式
libuv httpparser写的简单http server
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服