当前位置:博客首页>>C/C++ >> 阅读正文

字符串惯用法之strlen搜索字符串结尾

作者: 郑晓 分类: C/C++ 发布于: 2013-05-22 22:08 浏览(2,544) 评论(1)


最近这几天工作较忙,也懒了,所以没有及时更新。不过这两天发现个人博客这个关键词在百度的排名已经上到了首页第8位,希望尽力能稳定下来。
今天上一篇现代方法中的小知识-c语言字符串惯用法。
许多字符串操作需要搜索字符串的结尾,strlen函数就是一个重要的例子。下面的strlen函数搜索字符串参数的结尾,并且使用一个变量来跟踪字符串的长度:

size_t strlen(const char *s) {
    size_t n;
    for(n=0;*s!='\0';s++) {
        n++;
    }
    return n;
}

指针s从左至右扫描整个字符串,变量n记录当前已经扫描的字符数量。当s最终指向一个空字符’\0’,这时变量n中所包含的值就是字符串的长度。
现在看看是否能精简strlen函数的定义。首先,把变量n的初始化移到它的声明中:

size_t strlen(const char *s) {
    size_t n=0;
    for(;*s!='\0';s++) {
        n++;
    }
    return n;
}

接下来注意到,条件*s!=’\0’其实与*s!=0的效果是一样的,因为空字符的整数值就是0.而测试*s!=0与测试*s是一样的,两者都在*s不为0时结果为真。这些发现引出strlen函数的又一个精简版本:

size_t strlen(const char *s) {
    size_t n=0;
    for(;*s;s++) {
        n++;
    }
    return n;
}

大家应该也能知道,在for的条件判断中,同一个表达示对s进行自增操作并且测试*s也是可以的,所以我们又得到了如下的精简:

size_t strlen(const char *s) {
    size_t n=0;
    for(;*s++;) {
        n++;
    }
    return n;
}

当我们使用while来代替for循环后,函数变成了这样:

size_t strlen(const char *s) {
    size_t n=0;
    while(*s++) {
        n++;
    }
    return n;
}

到这里我们已经对我们的strlen函数进行了非常明显的精简,但是可能仍没有提高它的运行速度,至少至于一些编译器来说下面的版本确实会更快一些:

size_t strlen(const char *s) {
    const char *p=s;
    while(*s) {
        s++;
    }
    return s-p;//返回两个地址的差值
}

这个版本的strlen函数通过定位空字符位置的方式来计算字符串的长度,然后用空字符的地址s减去字符串中第一个字符的地址p,得到的便是字符串的长度。运行速度的提升得益于不需要在while循环内部对n进行自增。

以上就是C语言中字符串惯用法之strlen函数搜索字符串的结尾的介绍。

↓↓↓微信扫码请我吃辣条↓↓↓

本文出自 郑晓个人博客,转载时请注明出处及相应链接。

本文永久链接: https://www.zh30.com/string-idiom-search-string-at-the-end-of-strlen.html

字符串惯用法之strlen搜索字符串结尾:目前有1 条留言

用户评论头像 哥们网发表于 2013年06月01日 00:45[回复]

😕 strlen是什么东东