13. 《C語言》——【strlen函數的使用和模擬實現】

文章目錄

  • 前言
  • 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; 
}

運行結果:

在這里插入圖片描述

分析:

  1. 值得注意的是strlen函數的返回值是size_t,也就是返回無符號整型,那么對應的占位符使用%zd。
  2. const char * str , 接收的是數組首元素的地址。
  3. 使用庫函數,不要忘記包含對應的頭文件。

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; 
}

運行結果:

在這里插入圖片描述

分析:

  1. 為了完成strlen函數的模擬,我們自己寫了一個函數:my_strlen。首先,函數進行傳參(數組傳參傳的是數組首元素的地址)。其次,創建變量len來接收值。最后打印該值。
  2. 進入函數里面,我們該如何去寫? 既然傳遞的是地址,那么我們需要使用指針來接收,為了不想讓值被修改,我們可以加上const的修飾指針。返回類型我們就按照strlen函數的一樣就可以。
  3. 然后,既然是使用計數器方法,我們就創建一個計數器count。在其之前,我們可以使用assert函數斷言一下,判斷一下我們的指針是不是空指針,如果是會報出錯誤,使用assert,需要包含對應的頭文件。
  4. 我們需要遍歷數組元素,如果指針*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; 
}

運行結果:

在這里插入圖片描述

分析:

  1. 創建一個字符數組,值為"abcdefg" , 隨后,創建一個函數叫my_strlen,對它進行傳參。創建len來接收my_strlen的值,最后打印該值。
  2. 進入函數內部,因為my_strlen傳遞的是數組首元素的地址,我們需要使用指針p來接收,并且使用const修飾指針p。my_strlen的返回類型是size_t。
  3. assert斷言一下指針變量是不是為空,使用assert需要包含頭文件。創建2個新的指針變量,分別為start和end,把p賦值給這2個指針變量。隨后進行遍歷,如果不是’\0’,end++。最后,end - start 也就是指針-指針,并且返回。

方法3

我們使用遞歸來解決,那么如何去使用遞歸?我們知道,使用遞歸需要遵循2個前提

  1. 遞歸存在限制條件,當滿足這個限制條件時,遞歸就不再繼續
  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; 
}

運行結果:

在這里插入圖片描述

分析:

  1. 創建字符數組,并且進行初始化;寫一個函數my_strlen,創建一個變量len,接收值。最后,打印值。
  2. 進入函數內部,既然傳遞的是數組首元素的地址,我們就創建指針變量p來接收,我們不想讓值進行改變,使用const修飾指針變量。my_strlen函數的返回類型與strlen函數一致,為size_t 。
  3. 使用assert斷言一下,確保p不是空指針。使用assert需要保證包含頭文件。
  4. 在前面,我們說了遞歸的使用方法,需要有一個限制條件,那么如果p不等于’\0’,就進行遞歸,否則,else 返回0。

總結

  1. 以上就是本文章的內容,我們使用了3個方法來模擬strlen函數。
  2. 感謝大家的閱讀,希望能夠給一個大大的關注~
    在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22237.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22237.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22237.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

塑料焊接機熔深對激光焊接質量有什么影響

塑料焊接機的熔深對焊接質量具有直接且顯著的影響。以下是熔深對焊接質量影響的詳細解釋&#xff1a; 1. 焊接強度&#xff1a;熔深直接決定了焊縫的截面積&#xff0c;從而影響焊接接頭的強度。較深的熔深意味著焊縫的截面積更大&#xff0c;可以提供更強的結合力&#xff0c;…

OpenStreetMap部署(OSM)

參考&#xff1a;https://github.com/openstreetmap/openstreetmap-website/blob/master/DOCKER.md OpenStreeMap 部署 操作系統建議使用 Ubuntu 22 版本 安裝 Docker # 更新軟件包索引&#xff1a; sudo apt-get update # 允許APT使用HTTPS&#xff1a; sudo apt-get inst…

【計算機組成原理】詳談計算機發展歷程

計算機發展歷程 導讀一、計算機的誕生1.1 歷史背景1.2 計算機的發明 二、計算機硬件的發展1.1 計算機的四代變化1.1.1 第一代計算機bug的由來 1.1.2 第二代計算機1.1.3 第三代計算機半導體存儲器的發展 1.1.4 第四代計算機 1.2 個人計算機的發展1.2.1 微處理器的發展1.2.2 個人…

AIGC之Stable Diffusion Web Ui 初體驗

前言 Stable Diffusion辣么火&#xff0c;同學你確定不嘗試一下嘛&#xff1f; 純代碼學習版本搞啦&#xff0c;Web Ui 也得試試咧 網上有很多安裝Stable Diffusion Web Ui 的介紹了&#xff0c;我在這說一下我的踩坑記錄 想安裝的同學&#xff0c;看這個鏈接 萬字長文&#x…

U-Net: Convolutional Networks for Biomedical Image Segmentation--論文筆記

U-Net: Convolutional Networks for Biomedical Image Segmentation 資料 1.代碼地址 2.論文地址 https://arxiv.org/pdf/1505.04597 3.數據集地址 論文摘要的翻譯 人們普遍認為&#xff0c;深度網絡的成功訓練需要數千個帶注釋的訓練樣本。在本文中&#xff0c;我們提出…

44-5 waf繞過 - SQL注入繞WAF方法

環境準備: 43-5 waf繞過 - 安全狗簡介及安裝-CSDN博客然后安裝sqlilabs靶場:構建完善的安全滲透測試環境:推薦工具、資源和下載鏈接_滲透測試靶機下載-CSDN博客 一、雙寫繞過 打開sql靶場的第一關:http://127.0.0.1/sqli-labs-master/Less-1/?id=1 驗證一下waf是否開啟防…

C\C++內存管理(未完結)

文章目錄 一.C\C內存分布二.C語言中動態內存管理方式&#xff1a;malloc/calloc/realloc/free三.C內存管理方式3.1.new/delete操作內置類型3.2.new和delete操作自定義類型 四.operator new與operator delete函數&#xff08;重要點進行講解&#xff09;4.1. operator new與oper…

npm install 出錯,‘proxy‘ config is set properly. See: ‘npm help config‘

背景 從遠程clone下項目之后&#xff0c;使用命令 npm install 安裝依賴&#xff0c;報錯如下 意為&#xff1a; 報錯&#xff1a; npm犯錯!network與網絡連通性有關的問題。 npm犯錯!網絡在大多數情況下&#xff0c;你背后的代理或有壞的網絡設置。 npm犯錯!網絡 npm犯錯…

spring-kafka-生產者服務搭建測試(SpringBoot整合Kafka)

文章目錄 1、生產者服務搭建1.1、引入spring-kafka依賴1.2、使用Java代碼創建主題分區副本1.3、發送消息 1、生產者服務搭建 1.1、引入spring-kafka依賴 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/…

KOL營銷新篇章:互動式內容與線上活動如何助力品牌增長

在當今數字化時代&#xff0c;KOL營銷已成為品牌推廣的重點策略之一。然而&#xff0c;隨著市場競爭的加劇&#xff0c;單純依靠KOL的曝光已經不再足夠&#xff0c;更多的是需要與用戶進行互動&#xff0c;幫助品牌與受眾建立更緊密的聯系。本文將探討KOL營銷如何通過互動式內容…

《企業應用架構模式》學習指南

導讀&#xff1a;企業應用包括哪些&#xff1f;它們又分別有哪些架構模式&#xff1f; 世界著名軟件開發大師Martin Fowler給你答案 01什么是企業應用 我的職業生涯專注于企業應用&#xff0c;因此&#xff0c;這里所談及的模式也都是關于企業應用的。&#xff08;企業應用還有…

怎么用NodeJS腳本實現遠程控制空調

怎么用NodeJS腳本實現遠程控制空調呢&#xff1f; 本文描述了使用NodeJS腳本調用HTTP接口&#xff0c;實現控制空調&#xff0c;通過不同規格的通斷器&#xff0c;來控制不同功率的空調的電源。 可選用產品&#xff1a;可根據實際場景需求&#xff0c;選擇對應的規格 序號設備…

MySQL從入門到高級 --- 12.事務 13.鎖機制 14.日志

文章目錄 第十二章 && 第十三章 && 第十四章&#xff1a;12.事務12.1 特性12.2 隔離級別 13.鎖機制13.1 各存儲引擎對鎖的支持狀況&#xff1a;13.2 鎖特性13.3 MyISAM表鎖13.3.1 加表鎖 13.4 InnoDB行鎖13.4.1 行鎖特點13.4.2 行鎖模式 14.日志14.1 錯誤日志1…

深入理解計算機系統 第三版 中文版 圖5-27 p371 錯漏

中文版 英文版 對照 可以看出錯漏 這本書中文版很多錯漏,可以配合英文版查正,不過英文版也很多錯漏,所以不用太相信書本.要根據自己的理解來.

微軟云計算Windows Azure(一)

目錄 一、微軟云計算平臺二、微軟云操作系統Windows Azure&#xff08;一&#xff09;Windows Azure概述&#xff08;二&#xff09;Windows Azure計算服務&#xff08;三&#xff09;Windows Azure存儲服務&#xff08;四&#xff09;Windows Azure Connect&#xff08;五&…

Win 11官宣取消硬件限制,微軟這次徹底服軟了

上市近 3 年&#xff0c;微軟寄予厚望的 Win 11 終究落了個被上代 Win 10 光環狠狠掩埋的結局。 有小伙伴兒認為是 Win 11 本身做的太爛&#xff0c;更新頻繁、BUG 一堆&#xff0c;讓人失去興趣。 也有人認為&#xff0c;系統本身體驗沒啥大毛病&#xff0c;嚴苛的硬件限制才…

數據結構算法-堆排序

堆排序&#xff1a;利用堆的特性進行排序,先將數組轉換為堆對象&#xff08;最大堆或最小堆&#xff09;&#xff0c;以最大堆為例&#xff0c;每次heapify之后&#xff0c;取出堆頂&#xff08;索引為0)的元素與最后一個元素交換。以后每次做同樣的事情&#xff0c;只是堆的長…

Golang性能分析工具pprof--遠程分析時無法定位源代碼行數問題解決方案

場景 通過命令行模式的list命令&#xff0c;為了查看指標消耗在具體哪一行&#xff0c;需要源代碼。但實際程序是部署在線上或者程序的源代碼目錄變了&#xff0c;則pprof從默認路徑找不到代碼&#xff0c;無法顯示是哪一行的問題。 通過瀏覽器模式的source頁面&#xff0c;有…

JUC總結3

CAS 簡介 CAS的全稱是“比較并交換”&#xff0c;是一種無鎖的原子操作&#xff0c;其體現了樂觀所的思想&#xff0c;在無鎖的情況下保證線程操作共享數據的原子性。 CAS一共有3個值&#xff1a; 1、V&#xff1a;要更新的值&#xff1b; 2、E&#xff1a;預期值&#xf…

RHCE (Linux進階) Ubuntu 操作系統安裝教程

一、在官網下載iso鏡像文件 下載地址&#xff1a; https://cn.ubuntu.com/download/server/step1#downloads&#xff08;下載最新的Ubuntu 20.04 LTS服務器版本&#xff09; 二、VMware安裝配置過程 基本安裝過程 1、新建虛擬機 2、選擇典型即可 3、設置下載好的Ubuntu對應路…