C語言-字符串函數(shù)的實(shí)現(xiàn)(一)之strlen

C語言中的字符串函數(shù)有如下這些

  • 獲取字符串長(zhǎng)度
    • strlen
  • 長(zhǎng)度不受限制的字符串函數(shù)
    • strcpy
    • strcat
    • strcmp
  • 長(zhǎng)度受限制的字符串函數(shù)
    • strncpy
    • strncat
    • strncmp
  • 字符串查找
    • strstr
    • strtok
  • 錯(cuò)誤信息報(bào)告
    • strerror

接下來看看如何實(shí)現(xiàn)它們

獲取字符串長(zhǎng)度

strlen

我們看看文檔是怎樣說的,如下

strlen文檔

size_t strlen ( const char * str );

Get string length

獲取字符串長(zhǎng)度

Returns the length of the C string str.

返回C字符串str的長(zhǎng)度

The length of a C string is determined by the terminating null-character: A C string is as long as the number of characters between the beginning of the string and the terminating null character (without including the terminating null character itself).

C字符串長(zhǎng)度是由'\0'來確定的,也就是說從字符串的第一個(gè)開始只要遇到'\0'就結(jié)束長(zhǎng)度計(jì)算(不包含'\0')

This should not be confused with the size of the array that holds the string. For example:

不用困惑你創(chuàng)建的數(shù)組的大小,比如這樣

char mystr[100]="test string";

defines an array of characters with a size of 100 chars, but the C string with which mystr has been initialized has a length of only 11 characters. Therefore, while sizeof(mystr) evaluates to 100, strlen(mystr) returns 11.

定義一個(gè)大小為100的數(shù)組mystr邪意,然后mystr 就已經(jīng)被初始化為一個(gè)長(zhǎng)度為11的字符串了歉闰。所以呢旦万, sizeof(mystr) 會(huì)得出 100, 而strlen(mystr) 會(huì)返回 11.

綜上莽红,可以知道

  1. 字符串已經(jīng) '\0' 作為結(jié)束標(biāo)志竭业,strlen函數(shù)返回的是在字符串中 '\0' 前面出現(xiàn)的字符個(gè)數(shù)(不包含 '\0' )嘱兼。
  2. 該函數(shù)只認(rèn)'\0'国葬,參數(shù)指向的字符串必須要以 '\0' 結(jié)束。
  3. 注意函數(shù)的返回值為size_t,是無符號(hào)的

實(shí)現(xiàn)

strlen函數(shù)的實(shí)現(xiàn)有好幾種汇四。

比如

  1. 計(jì)數(shù)器的方法
  2. 遞歸
  3. 指針 - 指針

接下來一一實(shí)現(xiàn)接奈。

1. 計(jì)數(shù)器:使用一個(gè)變量來記錄 - count

斷言指針不為空是個(gè)好習(xí)慣~

int my_strlen(char* str) 
{
    int count = 0;
    assert(str != NULL);
    while (*str != '\0') // while (*str)
    {
        count++;
        str++;
    }
    return count;
}

就一直找'\0',當(dāng)*str不是'\0'時(shí)通孽,就count++序宦,str++,直到遇到'\0'停止背苦,然后返回count就是長(zhǎng)度了互捌。

2. 遞歸

斷言指針不為空是個(gè)好習(xí)慣~

int my_strlen(char* str)
{
    assert(str != NULL);
    char* p = str;
    while(*p == '\0')
    {
        return 0;
    }
    return 1 + my_strlen(p + 1);
}

比如傳入的str地址為 1000

那么 1 + my_strlen(p + 1) 中,p + 1行剂,指針偏移后就是1001秕噪,以此類推。

1 + 1 + my_strlen(p + 1)

1 + 1 + 1 + my_strlen(p + 1)

1 + 1 + 1 + 1 + my_strlen(p + 1)

...

1 + 1 + 1 + 1 + ... + 0

最終就可以得出長(zhǎng)度厚宰。

3. 指針-指針

斷言指針不為空是個(gè)好習(xí)慣~

int my_strlen(char* str) 
{
    assert(str != NULL);
    char* p = str;
    while (*p != '\0') 
    {
        p++;
    }
    return p - str;
}

把指針str的地址賦值給一個(gè)新的指針p腌巾,str作為指向起始地址的指針,不改變它铲觉,記錄起始地址壤躲。

然后通過指針p進(jìn)行查找'\0',判斷當(dāng)前字符是否為'\0'备燃,不是就進(jìn)行p++,然后繼續(xù)判斷下一個(gè)字符凌唬,如此循環(huán)并齐,直到指針p找到'\0',然后用 當(dāng)前的指針p 減去 起始指針str 進(jìn)行返回客税,就是長(zhǎng)度了况褪。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市更耻,隨后出現(xiàn)的幾起案子测垛,更是在濱河造成了極大的恐慌,老刑警劉巖秧均,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件食侮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡目胡,警方通過查閱死者的電腦和手機(jī)锯七,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誉己,“玉大人眉尸,你說我怎么就攤上這事。” “怎么了噪猾?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵霉祸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我袱蜡,道長(zhǎng)丝蹭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任戒劫,我火速辦了婚禮半夷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘迅细。我一直安慰自己巫橄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布茵典。 她就那樣靜靜地躺著湘换,像睡著了一般。 火紅的嫁衣襯著肌膚如雪统阿。 梳的紋絲不亂的頭發(fā)上彩倚,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音扶平,去河邊找鬼。 笑死哥谷,一個(gè)胖子當(dāng)著我的面吹牛麻献,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播监婶,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惑惶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼短纵!你這毒婦竟也來了集惋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤踩娘,失蹤者是張志新(化名)和其女友劉穎刮刑,沒想到半個(gè)月后喉祭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雷绢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年泛烙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翘紊。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔽氨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帆疟,到底是詐尸還是另有隱情鹉究,我是刑警寧澤踪宠,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站绍妨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏柬脸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一倒堕、第九天 我趴在偏房一處隱蔽的房頂上張望灾测。 院中可真熱鬧,春花似錦垦巴、人聲如沸媳搪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽活逆。三九已至蔗候,卻和暖如春锈遥,著一層夾襖步出監(jiān)牢的瞬間丽惶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留儒士,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像憋沿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壶辜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容