【练习题】解析URL中的路径和查询字符串

时间:2022-05-07 12:21:42

动态网页的URL末尾通常带有查询,例如:

http://www.google.cn/search?complete=1&hl=zh-CN&ie=GB2312&q=linux&meta=http://www.baidu.com/s?wd=linux&cl=3

比如上面第一个例子,http://www.google.cn/search是路径部分, ?号后面的complete=1&hl=zhCN&ie=GB2312&q=linux&meta=是查询字符串,由五个“key=value”形式的键值对( Key-valuePair) 组成,以&隔开,有些键对应的值可能是空字符串,比如这个例子中的键meta现在要求实现一个函数,传入一个带查询字符串的URL,首先检查输入格式的合法性,然后对URL进行切分,将路径部分和各键值对分别传出,请仔细设计函数接口以便传出这些字符串。如果函数中有动态分配内存的操作,还要另外实现一个释放内存的函数。完成之后,为自己设计的函数写一个Man Page。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 10
typedef struct
{
char *tokens[N];
int count;
}unit_t;

void find_url_token(char *str,unit_t *ptr)
{
const char *needle = "://";
char *token = NULL;
char *saveptr = NULL;
int i;

if(strstr(str,needle))
{
for(i = 0;;i++,str = NULL)
{
token = strtok_r(str,"?&",&saveptr);
if(token == NULL)
break;
ptr->tokens[i] = token;
ptr->count++;
}
}
}
int main(void)
{
char str[] = "http://www.google.cn/search?complete=1&hl=zh-CN&ie=GB2312&q=linux&meta=";
unit_t *ptr = (unit_t *)malloc(sizeof(unit_t));

find_url_token(str,ptr);
int i;
for(i=0;i<ptr->count;i++)
printf("%s\n",ptr->tokens[i]);
free(ptr);

return 0;
}