当前位置: 首页 > news >正文

C语言 解析URL

最近需要用到解析一个URL的合法性,找了半天发现C语言没有解析URL的库函数,
那么只好自己去写了。
在网上找了一段代码,非常好,亲测有效,特来分享!
转载地址:https://www.oschina.net/code/snippet_656503_12501

#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 0;
    }
    len = parseptr1 - parseptr2;
    for ( i = 0; i < len; i++ ) {
        if ( !isalpha(parseptr2[i]) ) {
            printf("URL错误!\n");
            return 0;
        }
    }
    printf("protocol: ");
    for(i=0;i<len;i++)
        printf("%c",parseptr2[i]);
    printf("\n");//解析协议
    parseptr1++;
    parseptr2 = parseptr1;
    for ( i = 0; i < 2; i++ ) {
        if ( '/' != *parseptr2 ) {
            printf("URL错误!\n");
            return 0;
        }
        parseptr2++;
    }
    parseptr1 = strchr(parseptr2, ':');
    if ( NULL == parseptr1 )//判断有无端口号
    {
        parseptr1 = strchr(parseptr2, '/');
        if ( NULL == parseptr1 ) {
        printf("URL错误!\n");
        return 0;}
        len = parseptr1 - parseptr2;
        printf("host: ");
        for(i=0;i<len;i++)
           printf("%c",parseptr2[i]);
        printf("\n");//解析主机
    }
    else{
    len = parseptr1 - parseptr2;
    printf("host: ");
    for(i=0;i<len;i++)
        printf("%c",parseptr2[i]);
    printf("\n");
    parseptr1++;
    parseptr2 = parseptr1;
    parseptr1 = strchr(parseptr2, '/');
    if ( NULL == parseptr1 ) {
        printf("URL错误!\n");
        return 0;
    }
    len = parseptr1 - parseptr2;
    printf("port: ");
    for(i=0;i<len;i++)
        printf("%d",(parseptr2[i]-48));
    printf("\n");//解析端口
    }
    parseptr1++;
    parseptr2 = parseptr1;
    while ( '\0' != *parseptr1 && '?' != *parseptr1  && '#' != *parseptr1 ) {
        parseptr1++;
    }
    len = parseptr1 - parseptr2;
    printf("path: ");
        for(i=0;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=0;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=0;i<len;i++)
        printf("%c",parseptr2[i]);
    printf("\n");//判断有无片段并解析
         


完!!

相关文章:

  • C语言中字符串的几种定义方式
  • C语言中 scanf gets getchar 的区别
  • C语言浅谈unsigned和siged
  • C语言 将字符数组转换为字符串
  • C语言 == != 使用中一个要注意的地方
  • C语言 结构体中使用strcpy方法,以及结构体指针
  • C语言 判断字符是否是一个数字的两种方法
  • C语言 time.h
  • C语言 char* a 与 char a[]
  • C语言 堆栈
  • C语言中 使用popen函数向linux系统发送shell命令
  • linux下生成动态库和静态库
  • openssl源代码结构
  • 数字信封的生成及解析
  • linux系统中日志文件管理(日志文件分包)
  • [NodeJS] 关于Buffer
  • 【译】理解JavaScript:new 关键字
  • 2017 前端面试准备 - 收藏集 - 掘金
  • CSS居中完全指南——构建CSS居中决策树
  • Java的Interrupt与线程中断
  • Median of Two Sorted Arrays
  • Nodejs和JavaWeb协助开发
  • python_bomb----数据类型总结
  • Vue组件定义
  • Zsh 开发指南(第十四篇 文件读写)
  • 从setTimeout-setInterval看JS线程
  • 从零搭建Koa2 Server
  • 回流、重绘及其优化
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • elasticsearch-head插件安装
  • 大数据全解:定义、价值及挑战
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 数据结构
  • #if 1...#endif
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (52)只出现一次的数字III
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (四) Graphivz 颜色选择
  • (一)基于IDEA的JAVA基础1
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转载)Linux网络编程入门
  • .naturalWidth 和naturalHeight属性,
  • .NET CORE Aws S3 使用
  • .net 获取url的方法
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .netcore如何运行环境安装到Linux服务器
  • .net操作Excel出错解决
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net连接oracle数据库