当前位置:首页 » 编程语言 » c语言解析url
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言解析url

发布时间: 2023-05-14 20:11:51

① 在c语言中如何实现对编码后的URL进行解码

字符串与数字量的转换,可以按照标准的编码(如Unicode,utf8等等)进行编码解码。URL编码就有编码规则,解码时就按既定的编码规则进行就可以了。

② 用纯C语言 怎样编程,解析HTTP协议。

按照HTTP协议的规定,理清楚相关功能。
然后软件模型的方式解释HTTP的运行过程,可以使用UML语言。
然后将UML语言转换成C语言即可。

③ c语言截取下载url中文件名称

思路大概如下:将整个字符串及其长度传给函数,然后在函数中用指针接收字符串,利用其长度把指针移到字符串结尾处,然后用循环不断将指针向前移动,并判断其指向的字符与/是不是一样的,如果一样退出循环,此时指针指向着字符串中最后一个/ 的前一个字符, 因此最后将指针再向前移2位到/后面的一个字符,最后反回指针, 再输出返回的指针后面的内容就是名称了

函数声明:char* GetName(char*,int);
整个程序:
#include<stdio.h>
char* GetName(char*,int);
int main(void)
{
char str[] = "https://gss0.bdstatic.com/70cFsjip0QIZ8tyhnq/img/logo-.gif";
char *name;
int n;
n = sizeof(str); //计算字符串的长度(包括'\0')
name = GetName(str,n); //把字符串及其长度传给函数
printf("%s\n",name); //name就是那个名称,可以输出
return 0;
}

char* GetName(char*ptr,int n)
{
int i = n; //这里i只是为循环即使终止了也未找到/而准备
ptr+=n; //把指针移到字符串的尾部,即'\0'处
while(i-->0)
{
if((*ptr--) == '/') //指针不断回移并判断是否为/符号
{
break; //从后向前遇到第一个/后退出循环
}
}
ptr+=2;
return ptr; //反回最后一个/后面的字符串即名称
}
函数原型:
char* GetName(char*ptr,int n)
{
int i = n;
ptr+=n;
while(i-->0)
{
if((*ptr--) == '/')
{
break;
}
}
ptr+=2;
return ptr;
}

④ 用c语言判断网址怎么做呢

/*
问题地址:http://..com/question/317437658.html

详解:
标准的网址(URL)格式是这样的:
http://user:pass@myserver:port/myapp1/myapp2/index.html?key1=value2&key2=value2#anchor
其中:
[1] http 是协议类型,同样的还有 ftp 等。【可省略,一般浏览器默认都是 http】
[2] user 是用户名,pass 是密码。【可省略】
[3] myserver 可以是服务器的 ip 或者域名,
如网络的 ip = 220.181.112.143 , 域名是:www..com
【这个不能省略】
[4] port 是端口。【可省略,一般默认都是 80】
[5] myapp1,myapp2 是应用程序目录。【可省略】
index.html 是当前页面【可省略,默认是 index.html,default.html 等】
[6] key1,value1,key2,value2 是传递给网站的参数,【可省略】
[7] anchor 是网页内的锚点

合法的网址举例:
www..com
http://__anglfish:[email protected]:80/
http://..com/question/311110938.html?an=0&si=1

判断网址算法:
最简单的当然是正则表达式了。
我们看到标准网址(URL)的 7 个部分,有 6 个分割符号,分别是:
://
@
:
/
?
#
在浏览器里面,只有第 3 部分是必须填写的,也是我们日常写的最多的。

用到的资源文件:
头文件 deelx.h,可以到:http://www.regexlab.com/zh/deelx/下载
下载后放到和源程序同一个目录下即可。
*/

#include <stdio.h>
#include "deelx.h"

int main(int argc, char * argv[])
{
char text[1000] = "http://user:[email protected]:800/myapp1/myapp2/index.html?key1=value1&key2=value2#anchor";
// 判断合法网址的正则表达式
static CRegexpT <char> regexp
(
"(([:alpha:]+)\\://)?((\\w+)\\:(\\w+)@)?(\\w+(\\.\\w+)*)(\\:(\\d+))?((/\\w+)*(\\.\\w+)?)?(\\?((\\w+=\\w+&)*(\\w+=\\w+)))?(#((\\w+)))?)"
);
int i;

printf("输入一个网址:");
while(scanf("%s",text))
{
MatchResult result = regexp.Match(text);
if ( result.IsMatched() )
{
/*
for(i=0;i<result.MaxGroupNumber();i++)
{
printf("%d=%.*s\n", i,result.GetGroupEnd(i) - result.GetGroupStart(i), text + result.GetGroupStart(i));
}
*/

// 解析网址
printf("网址:%.*s\n", result.GetGroupEnd(0) - result.GetGroupStart(0), text + result.GetGroupStart(0));
printf("协议类型:%.*s\n",result.GetGroupEnd(2) - result.GetGroupStart(2), text + result.GetGroupStart(2));
printf("用户名:%.*s\n",result.GetGroupEnd(4) - result.GetGroupStart(4), text + result.GetGroupStart(4));
printf("用户密码:%.*s\n",result.GetGroupEnd(5) - result.GetGroupStart(5), text + result.GetGroupStart(5));
printf("服务器IP或域名:%.*s\n",result.GetGroupEnd(6) - result.GetGroupStart(6), text + result.GetGroupStart(6));
printf("服务器端口:%.*s\n",result.GetGroupEnd(9) - result.GetGroupStart(9), text + result.GetGroupStart(9));
printf("应用程序目录:%.*s\n",result.GetGroupEnd(10) - result.GetGroupStart(10), text + result.GetGroupStart(10));
printf("查询参数:%.*s\n",result.GetGroupEnd(14) - result.GetGroupStart(14), text + result.GetGroupStart(14));
printf("锚:%.*s\n\n",result.GetGroupEnd(18) - result.GetGroupStart(18), text + result.GetGroupStart(18));

}
else
{
printf("\"%s\" 是一个非法的网址!!!\n",text);
}
printf("输入一个网址:");
}

return 0;
}

/*
运行结果:

输入一个网址:http://user:[email protected]:800/myapp1/myapp2/index.html?key1=value1&key2=value2#anchor
网址:http://user:[email protected]:800/myapp1/myapp2/index.html?key1=value1&key2=value2#anchor
协议类型:http
用户名:user
用户密码:pass
服务器IP或域名:myserver.com
服务器端口:800
应用程序目录:/myapp1/myapp2/index.html
查询参数:key1=value1&key2=value2
锚:anchor
*/