1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <ctype.h>
5 #define MAXN 1024+10
6 char url [MAXN] = "http://www.google.com:80/wiki/Search?search=train&go=Go#steammachine";
7
8 int main()
9 {
10 const char *parseptr1;
11 const char *parseptr2;
12 int len;
13 int i;
14 parseptr2 = url;
15 parseptr1 = strchr(parseptr2, ':');
16 if ( NULL == parseptr1 ) {
17 printf("URL错误!\n");
18 return 0;
19 }
20 len = parseptr1 - parseptr2;
21 for ( i = 0; i < len; i++ ) {
22 if ( !isalpha(parseptr2[i]) ) {
23 printf("URL错误!\n");
24 return 0;
25 }
26 }
27 printf("protocol: ");
28 for(i=0;i<len;i++)
29 printf("%c",parseptr2[i]);
30 printf("\n");//解析协议
31 parseptr1++;
32 parseptr2 = parseptr1;
33 for ( i = 0; i < 2; i++ ) {
34 if ( '/' != *parseptr2 ) {
35 printf("URL错误!\n");
36 return 0;
37 }
38 parseptr2++;
39 }
40 parseptr1 = strchr(parseptr2, ':');
41 if ( NULL == parseptr1 )//判断有无端口号
42 {
43 parseptr1 = strchr(parseptr2, '/');
44 if ( NULL == parseptr1 ) {
45 printf("URL错误!\n");
46 return 0;}
47 len = parseptr1 - parseptr2;
48 printf("host: ");
49 for(i=0;i<len;i++)
50 printf("%c",parseptr2[i]);
51 printf("\n");//解析主机
52 }
53 else{
54 len = parseptr1 - parseptr2;
55 printf("host: ");
56 for(i=0;i<len;i++)
57 printf("%c",parseptr2[i]);
58 printf("\n");
59 parseptr1++;
60 parseptr2 = parseptr1;
61 parseptr1 = strchr(parseptr2, '/');
62 if ( NULL == parseptr1 ) {
63 printf("URL错误!\n");
64 return 0;
65 }
66 len = parseptr1 - parseptr2;
67 printf("port: ");
68 for(i=0;i<len;i++)
69 printf("%d",(parseptr2[i]-48));
70 printf("\n");//解析端口
71 }
72 parseptr1++;
73 parseptr2 = parseptr1;
74 while ( '\0' != *parseptr1 && '?' != *parseptr1 && '#' != *parseptr1 ) {
75 parseptr1++;
76 }
77 len = parseptr1 - parseptr2;
78 printf("path: ");
79 for(i=0;i<len;i++)
80 printf("%c",parseptr2[i]);
81 printf("\n");//解析路径
82 parseptr2=parseptr1;
83 if ( '?' == *parseptr1 ) {
84 parseptr2++;
85 parseptr1 = parseptr2;
86 while ( '\0' != *parseptr1 && '#' != *parseptr1 ) {
87 parseptr1++;
88 }
89 len = parseptr1 - parseptr2;
90 printf("query: ");
91 for(i=0;i<len;i++)
92 printf("%c",parseptr2[i]);//判断有无询问并解析
93 printf("\n");
94 }
95 parseptr2=parseptr1;
96 if ( '#' == *parseptr1 ) {
97 parseptr2++;
98 parseptr1 = parseptr2;
99 while ( '\0' != *parseptr1 ) {
100 parseptr1++;
101 }
102 len = parseptr1 - parseptr2;
103 printf("fragment: ");
104 for(i=0;i<len;i++)
105 printf("%c",parseptr2[i]);
106 printf("\n");//判断有无片段并解析
107
108 }
109 }