Redis设计与实现书中勘误-sdstrim函数解释错误

Redis 3.0 unstable 版本中,《Redis设计与实现》作者在书中写到

使用sdstrim函数后,sds字符串变为

源码中C的实现为

sds sdstrim(sds s, const char *cset) {
    struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
    char *start, *end, *sp, *ep;
    size_t len;
    // 设置和记录指针
    sp = start = s;
    ep = end = s+sdslen(s)-1;
    // 修剪, T = O(N^2)
    while(sp <= end && strchr(cset, *sp))
        sp++;
    while(ep > start && strchr(cset, *ep))
        ep--;
    // 计算 trim 完毕之后剩余的字符串长度
    len = (sp > ep) ? 0 : ((ep-sp)+1);
    // 如果有需要,前移字符串内容
    // T = O(N)
    if (sh->buf != sp) memmove(sh->buf, sp, len);
    // 添加终结符
    sh->buf[len] = '\0';
    // 更新属性
    sh->free = sh->free+(sh->len-len);
    sh->len = len;
    // 返回修剪后的 sds
    return s;
}

其中,trim主要使用两个指针,sp和ep(开始指针和结束指针),由两个while控制

while(sp <= end && strchr(cset, *sp))
        sp++;
    while(ep > start && strchr(cset, *ep))
        ep--;

这两个while只是将被修剪字符串的两边进行修剪,而碰到非修剪集合的字符指针不会移动。例如:

字符串:"XXXXYYXBXXXBXXXYYY" ,修剪集合 "XY"
修剪结果 "为BXXXB", 而不是"BB"
posted @ 2020-09-04 16:32  顾wenfan  阅读(319)  评论(0编辑  收藏  举报