版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第C語言strlen函數(shù)全方位講解目錄strlen函數(shù)的講解strlen函數(shù)的模擬實現(xiàn)計數(shù)器方式遞歸的方式指針減指針的方式
strlen函數(shù)的講解
strlen函數(shù)我們應該不陌生,它可以幫助我們求字符串的長度(不包括\0),但里面還有一些細節(jié)需要我們注意??匆幌孪旅孢@張圖:
strlen函數(shù)的頭文件是string.h.如果要使用strlen這個函數(shù),別忘記引頭文件。
字符串是以\0作為結束標志,strlen函數(shù)返回的是在字符串中\(zhòng)0前面出現(xiàn)的字符個數(shù)。以下是用strlen函數(shù)時可能會遇到的幾種問題,先看代碼:
#includestdio.h
#includestring.h
intmain()
chararr1[]="qwer";
chararr2[]={'q','w','e','r'};
chararr3[]={'q','w','e','r','\0'};
chararr4[10]={'q','w','e','r'};
printf("arr1:%d\n",strlen(arr1));
printf("arr2:%d\n",strlen(arr2));
printf("arr2:%d\n",strlen(arr3));
printf("arr2:%d\n",strlen(arr4));
return0;
以上代碼輸出的結果是什么?大家可以先試著算一下。然后再看運行結果。
運行結果如圖所示,arr1初始化的時候存放的是字符串,字符串的是以\0為結束標志的,所以arr1的大小為4。這個應該問題不大。
重點說一下下面這幾個。
arr2:我在初始化arr2的時候,是對arr2是以字符進行初始化的,但是我沒有設置arr的大小,所以編譯器是不知道arr2的大小的,后面存放的是什么東西也是不知道的,但是strlen它是找\0的,并返回\0之前字符的個數(shù)。所以
在strlen找到\0之前,前面有36個字符。
arr3:arr3與arr2不同的是,但是我在最后輸入了\0進行初始化,所以arr3很簡單的就找到了\0,并返回4。
arr4:arr4與arr2不同的是:我這次設置了arr4的大小,然后我用字符對arr4進行了初始化,雖然是用字符進行的部分初始化,但是編譯器會幫我把沒初始化的地方默認初始化為0,\0的ASCII碼值就是0,C語言字符在內(nèi)存的形式就是ASCII碼值,所以后面沒初始化的地方存放的都是\0。
我們再來看一個東西,由上面的圖,我們還可以知道strlen的返回值是size_t,這是一個無符號數(shù)。如果不清楚這個地方,我們也可能會在使用strlen的時候出現(xiàn)一些問題??匆幌孪旅娴拇a:
#includestdio.h
#includestring.h
intmain()
if(strlen("abc")-strlen("qwer")0)
printf("1");
else
printf("0");
return0;
對于上面的代碼的運行結果是什么?
按常理來說,前面的字符串大小為3,后面的為4,比4小應該會打印1。我們來看運行結果:
它的運行結果是0,難道前面的字符串大小比后面的大嗎,其實不是。關鍵在于它的返回值是一個無符號數(shù)。無符號數(shù)只有正數(shù),沒有負數(shù)。3-4=-1,但是此時的-1并不是有符號數(shù),而是一個無符號數(shù),那么-1此時就是一個很大的正數(shù)。所以此時才會輸出0
如果要解決這個問題,有以下兩種解決方案:
方法1:不相減,進行比較:
#includestdio.h
#includestring.h
intmain()
if(strlen("abc")strlen("qwer"))
printf("1");
else
printf("0");
return0;
方法2:強制類型轉換
#includestdio.h
#includestring.h
intmain()
if((int)strlen("abc")-(int)strlen("qwer")0)
printf("1");
else
printf("0");
return0;
說一下方法1,無符號數(shù)只有正數(shù),沒有負數(shù),直接計算大?。ㄕ龜?shù))就可以直接比較了。方法2是強制轉換為int類型的數(shù)據(jù),整型是有符號數(shù),有符號數(shù)就可以進行相減,結果為-1,就是-1。兩種結果輸出結果都是1.
strlen函數(shù)的模擬實現(xiàn)
講完了strlen函要注意的問題,下面講一下strlen函數(shù)的模擬實現(xiàn)??偣灿腥N方法:計數(shù)器方式,遞歸的方式和指針-指針的方式。
計數(shù)器方式
實現(xiàn)的思想:設置一個計數(shù)的變量,讓一個字符指針遍歷字符數(shù)組的每一個元素,如果指針指向的元素不是\0,計算器就自增,直到指針指向的元素是\0,就停止遍歷,并返回計數(shù)器。
因為是模擬實現(xiàn),我們就只求一致,返回值就設置為size_t。
實現(xiàn)代碼如下:
#includestdio.h
#includestring.h
#includeassert.h
size_tmy_strlen(constchar*p)
intcount=0;
assert(p!=NULL);//如果等于空指針就會報錯
while((*p)!='\0')
count++;
p++;
returncount;
intmain()
chararr[]="CSDN";
intret=my_strlen(arr);
printf("%d",ret);
return0;
}
遞歸的方式
代碼實現(xiàn)的思想:這種方式是不用創(chuàng)建臨時變量的一種方法,只使用指針進行遍歷,如果指針指向的不是\0,那么就返回1和指針指向后一個數(shù)據(jù)的結果。
size_tmy_strlen(constchar*p)
if((*p)=='\0')
return0;
else
return1+my_strlen(p+1);
intmain()
chararr[]="CSDN";
intret=my_strlen(arr);
printf("%d",ret);
return0;
指針減指針的方式
代碼實現(xiàn)的思想:
元素名是首元素的地址,我們就在定義一個指針,指向這個數(shù)組,讓這個指針進行遍歷,指向的不是\0就讓指針進行自增。最后讓遍歷完數(shù)組的指針減去數(shù)組名(也就是首元素的地址)。
注意:當兩個指著指向同一塊空間時,指針減指針的絕對值就是兩個指針之間的元素個數(shù),而不是個數(shù)*數(shù)據(jù)類型所占的空間。
size_tmy_strlen(constchar*p)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB 12142-2025便攜式金屬梯安全要求
- 題目易錯數(shù)學題及答案初中
- 酒駕之風討論題目及答案
- 養(yǎng)老院消防演練制度
- 養(yǎng)老院老人生活娛樂活動組織人員管理制度
- 農(nóng)業(yè)公司財務制度
- 辦公室辦公用品領用管理制度
- 健設銀行面試題目及答案
- 飲品行業(yè)工藝流程總結
- Python編碼規(guī)范及范例分析
- 鋁錠居間合同樣本
- 新概念第一冊雙課聽力文本全(英文翻譯)
- 三高知識課件
- 租賃手機籌資計劃書
- 電子束直寫技術講座
- IT行業(yè)模板:軟件驗收單
- 項目監(jiān)理人員廉潔從業(yè)承諾書
- 矚目軟件基本操作說明
- 短篇文言文翻譯
- 疾病產(chǎn)生分子基礎概論
- 70周歲以上的老年人三力測試題庫
評論
0/150
提交評論