

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 }