Chinaunix首页 | 论坛 | 博客
  • 博客访问: 283824
  • 博文数量: 41
  • 博客积分: 2630
  • 博客等级: 少校
  • 技术积分: 702
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-30 15:56
文章分类

全部博文(41)

文章存档

2012年(2)

2011年(2)

2010年(3)

2009年(26)

2008年(8)

我的朋友

分类: C/C++

2009-08-21 23:52:40

最近做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;
}


阅读(1507) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~