字符串函數`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模擬實現

請添加圖片描述

文章目錄

  • 🚀前言
  • 🚀庫函數strlen
    • ??strlen的模擬實現
  • 🚀庫函數strcpy
    • ??strcpy的模擬實現
  • 🚀strcmp
    • ??strcmp的模擬實現
  • 🚀strstr
    • ??strstr的模擬實現
  • 🚀strcat
    • ??strcat的模擬實現

🚀前言

今天阿輝將為大家介紹字符串庫函數strlenstrcpystrcmpstrstrstrcat的使用以及模擬實現,關注阿輝不迷路哦 😘 ,內容干貨滿滿😋,接下來就跟著阿輝一起學習吧👊

🚀庫函數strlen

庫函數strlen是專門求字符串長度的庫函數,strlen只能求字符串長度且要求字符串末尾須有\0,返回值長度不包括\0
strlen的函數聲明

size_t strlen(const char* src);
返回值為size_t類型
接受一個字符串的首元素地址,即可返回字符串長度

例子:

#include<stdio.h>
#include<string.h>int main()
{char* a = "abcdef";`//末尾有\0char c[] = { 'a','b','c','d','e','f' };//末尾無\0printf("%zd\n", strlen(a));printf("%zd\n", strlen(c));return 0;
}

輸出:
在這里插入圖片描述
上圖我們可以看到一個輸出6而一個卻是42,就是因為常量字符串a末尾有\0而字符串數組c末尾無\0,而庫函數strlen計算的長度是從字符串首元素到\0之間的元素個數,若字符串末尾無\0strlen則會一直向后找到\0位置然后返回。在C語言中\0堪稱字符串的靈魂,后面幾個函數會讓大家有更深的體會。

??strlen的模擬實現

鐵子們,咱們直接代碼以及詳解奉上👇

size_t my_strlen(const char* src)
{assert(src != NULL);//斷言判斷傳入指針不為空size_t ret = 0;//記錄字符串長度,作為返回值while (*src++)//這句代碼下面單獨解釋{ret++;}return ret;
}

關于while(*src++)這句代碼,因為后置++的優先級更高所以src++,但是又因為后置++實現使用后++,所以*src++這個表達式的值是*src然后src再加1,然后當指針src偏移到\0位置時while循環就停止了因為\0的本質就是0

🚀庫函數strcpy

庫函數strcpy是用來用來拷貝字符串的
strcpy的函數聲明:

char* strcpy(char* dest, const char* src);
把從src地址開始到\0的字符串復制到以dest開始的地址空間
返回值為拷貝位置起始地址

注意:

  • 將源指向的 C 字符串復制到目標指向的數組中,包括終止空字符(并在該點停止)
  • 源字符串必須以 ‘\0’ 結束。
  • 會將源字符串中的 ‘\0’ 拷貝到目標空間。
  • 目標空間必須足夠大,以確保能存放源字符串。
  • 目標空間必須可變

例子:

int main()
{char a[] = "abcd";char b[10] = { 0 };strcpy(b, a);printf("%s",b);return 0;
}

輸出:

abcd

??strcpy的模擬實現

char* my_strcpy(char* dest, const char* src)
{char* ret = dest;//記下目標位置起始地址assert(dest && src);//斷言判斷傳入的指針不為空while (*dest++ = *src++){;}return ret;//返回目標位置起始地址
}

*dest++ = *src++這段代碼可以理解為先進行*dest = *src ,然后dest = dest + 1; src = src + 1,當src指向\0時,\0賦給*dest然后跳出循環

🚀strcmp

庫函數strcmp的函數聲明:

int strcmp(const char* str1, const char* str2);

strcmp是用來比較字符串大小的函數,但并非是以字符串長度比較的,而是從兩個字符串的起始位置開始,一一對應地進行比較,如果它們彼此相等,則繼續以下對,直到字符不同或達到\0,字符不同時比較的是ASII值大小
返回值:

  • 第一個字符串大于第二個字符串,則返回大于0的數字
  • 第一個字符串等于第二個字符串,則返回0
  • 第一個字符串小于第二個字符串,則返回小于0的數字

例子:

int main()
{char a[] = "adc";char b[] = "abcd";int ret = strcmp(a, b);printf("%d ", ret);return 0;
}

輸出:

1

請添加圖片描述

??strcmp的模擬實現

int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')//兩字符串相等,同時指向字符串末尾的\0return 0;str1++;str2++;}return *str1 - *str2;//不等位置相減
}

🚀strstr

庫函數strstr的函數聲明:

char* strstr(const char* str1, const char* str2);

strstr函數是用來判斷主串str1中是否存在子串str2,如果存在則返回str1中第一次出現子串的起始位置地址,否則返回NULL
阿輝作圖給大家展示一下:
請添加圖片描述

int main()
{char a[] = "abcdsfejsl";char b[] = "dsfe";printf("%s", strstr(a, b));return 0;
}

輸出:

dsfejsl

因為返回的是主串中子串起始位置地址,上述代碼中也就是d位置的地址,用%s打印就是dsfejsl這一段

??strstr的模擬實現

char* my_strstr(const char* dest, const char* src)
{assert(dest && src);//斷言判斷不為空char* ret = dest;//ret作返回值,記錄主串下一個起始比對位置char* p = src;//記錄子串的起始位置if (*src == '\0')//子串為空直接返回主串{return ret;}while (*dest)//遍歷到主串\0位置跳出循環{//從主串起始比對位置與子串一一比對while (*dest++ == *src++)//不相等時跳出循環{if (*dest == '\0')//當主串遍歷到\0位置還進來,說明子串也到末尾\0位置了,直接返回主串起始比對位置{return ret;}}if (*src == '\0')//跳出循環時,src已到\0位置說明主串中找到子串,返回主串起始比對位置{return ret;}dest = ++ret;//上述if都沒進去說明該主串起始比對位置找不到子串,++ret記錄下一個起始比對位置,并把值賦給dest,從下一個起始比對位置開始遍歷src = p;//src返回子串起始位置}return NULL;//上述都為返回說明找不到,返回空
}

鐵子們不懂的話,下面這幅圖還有解釋:
請添加圖片描述

🚀strcat

庫函數strcat的函數聲明:

char* strcat(char* dest, const char* src);

strcat庫函數是用來把src所指向的字符串(包括\0)復制到dest所指向的字符串后面(刪除*dest原來末尾的\0)。要保證*dest足夠長,以容納被復制進來的*src*src中原有的字符不變。返回指向dest的指針
例子:

int main()
{char a[20] = "abc";char b[] = "dsfe";printf("%s\n", strcat(a, b));return 0;
}

輸出:

abcdsfe

??strcat的模擬實現

char* my_strcat(char* dest, const char* src)
{assert(dest && src);//斷言判斷不為空char* ret = dest;//記錄起始地址作為返回值while (*dest)//找到目標字符串\0位置{dest++;}while (*dest++ = *src++){;}return ret;
}

while (*dest++ = *src++)這段代碼前面大家見得多了,實在不理解可以自己敲出來試試,這里阿輝復制粘貼一下😘
*dest++ = *src++這段代碼可以理解為先進行*dest = *src ,然后dest = dest + 1; src = src + 1,當src指向\0時,\0賦給*dest然后跳出循環


到這里,阿輝今天對于C語言中部分字符函數的分享就結束了,希望這篇博客能讓大家有所收獲, 如果覺得阿輝寫得不錯的話,記得給個贊唄,鐵子們的支持是我創作的最大動力🌹
請添加圖片描述

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

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

相關文章

ReactJS和VueJS的簡介以及它們之間的區別

本文主要介紹ReactJS和VueJS的簡介以及它們之間的區別。 目錄 ReactJS簡介ReactJS的優缺點ReactJS的應用場景VueJS簡介VueJS的優缺點VueJS的應用場景ReactJS和VueJS的區別 ReactJS簡介 ReactJS是一個由Facebook開發的基于JavaScript的前端框架。它是一個用于構建用戶界面的庫&…

【C語言】——函數遞歸,用遞歸簡化并實現復雜問題

文章目錄 前言一、什么是遞歸二、遞歸的限制條件三、遞歸舉例1.求n的階乘2. 舉例2&#xff1a;順序打印一個整數的每一位 四、遞歸的優劣總結 前言 不多廢話了&#xff0c;直接開始。 一、什么是遞歸 遞歸是學習C語言函數繞不開的?個話題&#xff0c;那什么是遞歸呢&#xf…

電商平臺商品銷量API接口,30天銷量API接口接口超詳細接入方案說明

電商平臺商品銷量API接口的作用主要是幫助開發者獲取電商平臺上的商品銷量信息。通過這個接口&#xff0c;開發者可以在自己的應用或網站中實時獲取商品的銷量數據&#xff0c;以便進行銷售分析、庫存管理、市場預測等操作。 具體來說&#xff0c;電商平臺商品銷量API接口的使…

RocketMq集成SpringBoot(待完善)

環境 jdk1.8, springboot2.7.3 Maven依賴 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/> <!-- lookup parent from…

vue3 筆記 - 聲明式 一

官網&#xff1a;Vue.js - 漸進式 JavaScript 框架 | Vue.js vue3編寫有聲明式和響應式。該文章僅記錄聲明式。vue3聲明式與vue2相同。 一、生命周期 創建之前 beforeCreate()已創建 created()掛載之前 beforeMount()已掛載 mounted()銷毀之前 beforeUnmount()已銷毀 unmoun…

java面試-Dubbo和zookeeper運行原理

遠離八股文&#xff0c;面試大白話&#xff0c;通俗且易懂 看完后試著用自己的話復述出來。有問題請指出&#xff0c;有需要幫助理解的或者遇到的真實面試題不知道怎么總結的也請評論中寫出來&#xff0c;大家一起解決。 java面試題匯總-目錄-持續更新中 分布式注冊中心和服務調…

Unity中后處理簡介

文章目錄 前言一、后處理的原理二、我們看一下Unity文檔中&#xff0c;內置的后處理前后的效果后處理前&#xff1a;后處理后&#xff1a; 前言 我們在這篇文章中&#xff0c;了解一下Unity中的后處理效果 后期處理概述 一、后處理的原理 在后處理的過程中&#xff0c;我們主…

Java當中常用的算法

文章目錄 算法二叉樹左右變換數據二分法實現 冒泡排序算法插入排序算法快速排序算法希爾排序算法歸并排序算法桶排序算法基數排序算法分治算法漢諾塔問題動態規劃算法引子代碼實現背包問題 KMP算法什么是KMP算法暴力匹配KMP算法實現 今天我們來看看常用的算法&#xff0c;開干。…

《微信小程序開發從入門到實戰》學習四十五

4.4 云函數 云函數是開發者提前定義好的、保存在云端并且將在云端運行的JS函數。 開發者先定義好云函數&#xff0c;再使用微信開發工具將云函數上傳到云空間&#xff0c;在云開發控制臺中可看到已經上傳的云函數。 云函數運行在云端Node.js環境中。 小程序端通過wx.cloud.…

IP地址定位技術為網絡安全建設提供全新方案

隨著互聯網的普及和數字化進程的加速&#xff0c;網絡安全問題日益引人關注。網絡攻擊、數據泄露、欺詐行為等安全威脅層出不窮&#xff0c;對個人隱私、企業機密和社會穩定構成嚴重威脅。在這樣的背景下&#xff0c;IP地址定位技術應運而生&#xff0c;為網絡安全建設提供了一…

Python Selenium 自動登入1688

Python Selenium是一個用于自動化Web瀏覽器操作的庫。它提供了一組功能強大的工具和API&#xff0c;可以模擬用戶在瀏覽器中的行為&#xff0c;并執行各種任務&#xff0c;如點擊、輸入文本、提交表單等。 要使用Python Selenium登錄1688網站&#xff0c;需要進行以下步驟&…

iOS微信小程序虛擬支付解決方案

眾所周知&#xff0c;在IOS微信小程序不支持虛擬支付&#xff0c;一直是困擾IOS開發者、運營最頭疼的問題&#xff0c;主要原因是蘋果不允許IOS微信上架這類產品。導致微信小程序的開發者在IOS上都不能支付虛擬商品&#xff0c;虛擬商品包含了虛擬課程、會員、虛擬書等。 那么…

短視頻ai剪輯分發矩陣系統源碼3年技術團隊開發搭建打磨

如果您需要搭建這樣的系統&#xff0c;建議您尋求專業的技術支持&#xff0c;以確保系統的穩定性和安全性。 在搭建短視頻AI剪輯分發矩陣系統時&#xff0c;您需要考慮以下幾個方面&#xff1a; 1. 技術實現&#xff1a;您需要選擇適合您的需求和預算的技術棧&#xff0c;例如使…

肖sir__ 項目講解__項目數據

項目時間&#xff1a; 情況一&#xff1a;項目時間開始到上線的時間&#xff0c;這個時間一般比較長&#xff08;一年&#xff0c;二年&#xff0c;三年&#xff09; 情況二&#xff1a;項目的版本的時間或則是周期&#xff08;1個月&#xff0c;2個月&#xff0c;3個月&…

機器人、智能小車常用的TT電機/310電機/370電機選型對比

在制作智能小車或小型玩具時&#xff0c;在電機選型上一些到各種模糊混淆的概念&#xff0c;以及各種錯綜復雜的電機參數&#xff0c;本文綜合對比幾種常用電機的參數及特性適應范圍&#xff0c;以便快速選型&#xff0c;注意不同生產廠家的電機參數規則會有較大差異。 普通TT…

論文閱讀:PointCLIP: Point Cloud Understanding by CLIP

CVPR2022 鏈接&#xff1a;https://arxiv.org/pdf/2112.02413.pdf 0、Abstract 最近&#xff0c;通過對比視覺語言預訓練(CLIP)的零鏡頭學習和少鏡頭學習在2D視覺識別方面表現出了鼓舞人心的表現&#xff0c;即學習在開放詞匯設置下將圖像與相應的文本匹配。然而&#xff0c;…

【ET8】2.ET8入門-ET框架解析

菜單欄相關&#xff1a;ENABLE_DLL選項 ET->ChangeDefine->ADD_ENABLE_DLL/REMOVE_ENABLE_DLL 一般在開發階段使用Editor時需要關閉ENABLE_DLL選項。該選項關閉時&#xff0c;修改腳本之后&#xff0c;會直接重新編譯所有的代碼&#xff0c;Editor在運行時會直接使用最…

免費網頁抓取工具大全【附下載和工具使用教程】

在當今信息爆炸的時代&#xff0c;獲取準確而豐富的數據對于企業決策和個人研究至關重要。而網頁抓取工具作為一種高效獲取互聯網數據的方式&#xff0c;正逐漸成為大家解決數據需求的得力助手。本文將深入探討網頁抓取工具的種類&#xff0c;并為大家提供簡單實用的頁面采集教…

(企業項目)SpringBoot3整合校驗框架validation

在Spring Boot項目中使用校驗框架validation可以讓我們更方便地實現數據校驗和錯誤提示。下面是Spring Boot集成校驗框架validation的步驟。 添加依賴 在項目的pom.xml文件中添加validation依賴&#xff1a; <dependency><groupId>org.springframework.boot</…

C# 實現Lru緩存

C# 實現Lru緩存 LRU 算法全稱是最近最少使用算法&#xff08;Least Recently Use&#xff09;&#xff0c;是一種簡單的緩存策略。 通常用在對象池等需要頻繁獲取但是又需要釋放不用的地方。 代碼實現的基本原理就是使用鏈表&#xff0c;當某個元素被訪問時&#xff08;Get或…