當前位置: 博客首頁 >> C/C++ >> 閱讀正文

字符串慣用法之strlen搜索字符串結尾

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


最近這幾天工作較忙,也懶了,所以沒有及時更新。不過這兩天發(fā)現個人博客這個關鍵詞在百度的排名已經上到了首頁第8位,希望盡力能穩(wěn)定下來。
今天上一篇現代方法中的小知識-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時結果為真。這些發(fā)現引出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循環(huán)后,函數變成了這樣:

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循環(huán)內部對n進行自增。

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

? ? ? ?

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

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

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

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

?? strlen是什么東東

發(fā)表評論

change vcode