文章目錄
- 前言
- strlen函數
- strlen函數的使用
- strlen函數的3種方法實現
- 方法1
- 方法2
- 方法3
- 總結
前言
各位老板好~ , 今天我們講解strlen函數如何去使用以及如何去模擬實現strlen函數。希望各位老板能夠給一個點贊和一個大大的關注,感謝各位老板!
strlen函數
strlen函數的使用
在庫函數中,strlen函數的功能是求出字符串的長度,統計的是字符串中\0之前的字符個數。
函數原型如下:
size_t strlen ( const char * str );
使用strlen函數,需要包含頭文件:
#include<string.h>
使用代碼如下:
//strlen函數的使用
#include<string.h>
#include<stdio.h>
int main()
{char arr[] = "zhangsan"; size_t len = strlen(arr); printf("%zd\n", len); return 0;
}
運行結果:
分析:
- 值得注意的是strlen函數的返回值是size_t,也就是返回無符號整型,那么對應的占位符使用%zd。
- const char * str , 接收的是數組首元素的地址。
- 使用庫函數,不要忘記包含對應的頭文件。
strlen函數的3種方法實現
方法1
方法1,我們使用計數器方法,那么大概思路就是,我有一個指針變量p,它指向的是這個數組,指針變量p++,只要p指向的不是’\0’,那么我的計數器count++。
代碼如下:
//strlen函數的模擬實現
//方法1(計數器)
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{int count = 0; //計數器assert(p != NULL); while (*p != '\0')//只要*p不等于'\0' , count就++{count++; p++; }return count;
}
int main()
{char arr[] = "zhangsan"; size_t len = my_strlen(arr); printf("%zd\n", len); return 0;
}
運行結果:
分析:
- 為了完成strlen函數的模擬,我們自己寫了一個函數:my_strlen。首先,函數進行傳參(數組傳參傳的是數組首元素的地址)。其次,創建變量len來接收值。最后打印該值。
- 進入函數里面,我們該如何去寫? 既然傳遞的是地址,那么我們需要使用指針來接收,為了不想讓值被修改,我們可以加上const的修飾指針。返回類型我們就按照strlen函數的一樣就可以。
- 然后,既然是使用計數器方法,我們就創建一個計數器count。在其之前,我們可以使用assert函數斷言一下,判斷一下我們的指針是不是空指針,如果是會報出錯誤,使用assert,需要包含對應的頭文件。
- 我們需要遍歷數組元素,如果指針*p不是’\0’,那么計數器count++,最終,返回count就可以;如果是’\0’,直接結束。
方法2
方法二,我們使用指針-指針的方法。也就是讓指針末-指針首就可以得到中間值,指針-指針必須是在同一內存空間。
代碼如下:
//strlen函數的模擬實現
//方法2(指針-指針)
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{assert(p != NULL); const char* start = p; const char* end = p; while (*end != '\0'){end++; }return end - start; }
int main()
{char arr[] = "abcdefg"; size_t len = my_strlen(arr); printf("%zd\n", len);return 0;
}
運行結果:
分析:
- 創建一個字符數組,值為"abcdefg" , 隨后,創建一個函數叫my_strlen,對它進行傳參。創建len來接收my_strlen的值,最后打印該值。
- 進入函數內部,因為my_strlen傳遞的是數組首元素的地址,我們需要使用指針p來接收,并且使用const修飾指針p。my_strlen的返回類型是size_t。
- assert斷言一下指針變量是不是為空,使用assert需要包含頭文件。創建2個新的指針變量,分別為start和end,把p賦值給這2個指針變量。隨后進行遍歷,如果不是’\0’,end++。最后,end - start 也就是指針-指針,并且返回。
方法3
我們使用遞歸來解決,那么如何去使用遞歸?我們知道,使用遞歸需要遵循2個前提。
- 遞歸存在限制條件,當滿足這個限制條件時,遞歸就不再繼續。
- 每一次遞歸,都會接近限制條件。
當我們了解了這2個前提,那么我們就可以使用遞歸了。
代碼如下:
//strlen函數的模擬實現
//方法3(遞歸)
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{assert(p != NULL); if (*p != '\0')return 1 + my_strlen(p + 1);elsereturn 0;
}
int main()
{char arr[] = "abcdefg"; size_t len = my_strlen(arr); printf("%zd\n", len); return 0;
}
運行結果:
分析:
- 創建字符數組,并且進行初始化;寫一個函數my_strlen,創建一個變量len,接收值。最后,打印值。
- 進入函數內部,既然傳遞的是數組首元素的地址,我們就創建指針變量p來接收,我們不想讓值進行改變,使用const修飾指針變量。my_strlen函數的返回類型與strlen函數一致,為size_t 。
- 使用assert斷言一下,確保p不是空指針。使用assert需要保證包含頭文件。
- 在前面,我們說了遞歸的使用方法,需要有一個限制條件,那么如果p不等于’\0’,就進行遞歸,否則,else 返回0。
總結
- 以上就是本文章的內容,我們使用了3個方法來模擬strlen函數。
- 感謝大家的閱讀,希望能夠給一個大大的關注~