来自 http://www.oschina.net/code/snippet_656503_12501
容易写成自己输入URL,这里测试一个例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
#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"
);
//判断有无片段并解析
}
}
|