最近做url的统计,需要对url进行解析,研究了一下strtok()函数,发现使用起来很方便,但有一些要注意的地方,如作用域等。
使用方式如下:
char url[]="protocol://hostname:port/path/;parameters?query#fragment";
char sep[]=":/;?#";
printf("protocol:%s\n", strtok(url,sep));
printf("hostname:%s\n", strtok(NULL,sep));
printf("port:%s\n", strtok(NULL,sep));
我参照glibc整了一个版本出来:
/* Parse S into tokens separated by any character in DELIM.
If S is NULL, the last string strtok() was called with is used.
Returns a pointer to the next token found in strToken, or NULL when no more tokens are found.
通过分割串中的任一个或几个字符分解字符串为一组标记串。
s为要分解的字符串,delim为分隔符字符串。*/
static char *olds = NULL;
char* strtok(char *s, const char *delim)
{
char *token;
const char* p;
/* 判断s是已经扫完还是接着上次的扫描 */
if (s == NULL) {
if (olds == NULL)
return NULL;
else
s = olds;
}
/* 扫过s开始的一段delimiters */
while (*s != '\0') {
for (p = delim; *p != '\0'; ++p) {
if (*p == *s)
break;
}
if (*p == '\0')
break;
++s;
}
/* 找不到分隔符 */
if (*s == '\0') {
olds = NULL;
return NULL;
}
/* 找到token的结尾 */
token = s;
/* 找到最近一个delim出现的位置 */
while (*s != '\0') {
for (p = delim; *p != '\0'; ++p) {
if (*p == *s) {
/* 终止token串,并将OLDS指向下一个字符 */
*s = '\0';
olds = s + 1;
return token;
}
}
s++;
}
/* s已经扫描完成 */
olds = NULL;
return token;
}
|
阅读(1547) | 评论(0) | 转发(0) |