字符串慣用法之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是什么東東