當(dāng)前位置:博客首頁>>C/C++ >> 閱讀正文

字符串慣用法之strlen搜索字符串結(jié)尾

作者: 鄭曉 分類: C/C++ 發(fā)布于: 2013-05-22 22:08 瀏覽:5,510 評論(1)


最近這幾天工作較忙,也懶了,所以沒有及時更新。不過這兩天發(fā)現(xiàn)個人博客這個關(guān)鍵詞在百度的排名已經(jīng)上到了首頁第8位,希望盡力能穩(wěn)定下來。
今天上一篇現(xiàn)代方法中的小知識-c語言字符串慣用法。
許多字符串操作需要搜索字符串的結(jié)尾,strlen函數(shù)就是一個重要的例子。下面的strlen函數(shù)搜索字符串參數(shù)的結(jié)尾,并且使用一個變量來跟蹤字符串的長度:

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

指針s從左至右掃描整個字符串,變量n記錄當(dāng)前已經(jīng)掃描的字符數(shù)量。當(dāng)s最終指向一個空字符’\0’,這時變量n中所包含的值就是字符串的長度。
現(xiàn)在看看是否能精簡strlen函數(shù)的定義。首先,把變量n的初始化移到它的聲明中:

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

接下來注意到,條件*s!=’\0’其實與*s!=0的效果是一樣的,因為空字符的整數(shù)值就是0.而測試*s!=0與測試*s是一樣的,兩者都在*s不為0時結(jié)果為真。這些發(fā)現(xiàn)引出strlen函數(shù)的又一個精簡版本:

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

大家應(yīng)該也能知道,在for的條件判斷中,同一個表達示對s進行自增操作并且測試*s也是可以的,所以我們又得到了如下的精簡:

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

當(dāng)我們使用while來代替for循環(huán)后,函數(shù)變成了這樣:

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

到這里我們已經(jīng)對我們的strlen函數(shù)進行了非常明顯的精簡,但是可能仍沒有提高它的運行速度,至少至于一些編譯器來說下面的版本確實會更快一些:

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

這個版本的strlen函數(shù)通過定位空字符位置的方式來計算字符串的長度,然后用空字符的地址s減去字符串中第一個字符的地址p,得到的便是字符串的長度。運行速度的提升得益于不需要在while循環(huán)內(nèi)部對n進行自增。

以上就是C語言中字符串慣用法之strlen函數(shù)搜索字符串的結(jié)尾的介紹。

? ? ? ?

本文采用知識共享署名-非商業(yè)性使用 3.0 中國大陸許可協(xié)議進行許可,轉(zhuǎn)載時請注明出處及相應(yīng)鏈接。

本文永久鏈接: http://yjfs.org.cn/string-idiom-search-string-at-the-end-of-strlen.html

字符串慣用法之strlen搜索字符串結(jié)尾:目前有1 條留言

用戶評論頭像 哥們網(wǎng)發(fā)表于 2013年06月01日 00:45[回復(fù)]

?? strlen是什么東東

發(fā)表評論

change vcode