詳解字符串函數<string.h>(上)

1. strlen函數的使用和模擬實現

size_t strlen(const char* str);

1.1 函數功能以及用法

字符串長度

strlen函數的功能是計算字符串的長度。在使用時,要求用戶傳入需要計算長度的字符串的起始位置,并返回字符串的長度。

#include <stdio.h>
#include <string.h>int main()
{char arr[] = "abcdef";int len = strlen(arr);printf("%d\n", len);return 0;
}

1.2 函數的原理

該函數在得到字符串的起始位置之后,會從該起始位置開始依次向后檢索并計數,直到遇到'\0'為止。

1.3 注意事項

1. 字符串以 '\0' 作為結束標志,strlen函數返回的是在字符串中 '\0' 前?出現的字符個數(不包 含 '\0' )。

2. 參數指向的字符串必須要以 '\0' 結束。

3. 注意函數的返回值為size_t,是無符號的( 易錯 )

針對第三點,我們給出以下示例

#include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if(strlen(str2)-strlen(str1)>0)//出錯{printf("str2>str1\n");} else{printf("srt1>str2\n");}return 0;
}

由于strlen函數返回值的類型為“size_t”(unsigned int),所以兩個strlen函數返回值相減,得到的結果的類型也是“size_t”,而該類型的數據一定會是大于等于零的,這與我們的代碼所表達的意思不一致。

1.4 模擬實現

strlen的實現較為簡單,所以這里給出三種實現方式:

1.4.1 計數器

在函數內部創建一個計數器,用以記錄字符的個數

size_t my_strlen1(const char* str)
{assert(str);size_t count = 0;//計數器while(*str != '\0'){count++;str++;}return count;
}

1.4.2? 指針-指針

size_t my_strlen2(const char* str)
{assert(str);const char* strx = str;while(*strx != '\0'){strx++;}return strx - str;//指針-指針
}

1.4.3 遞歸

size_t my_strlen3(const char* str)
{assert(str);if(*str == '\0')return 0;elsereturn 1 + my_strlen3(str+1);
}

2. strcpy函數的使用和模擬實現

char* strcpy(char * destination, const char* source);

2.1 函數功能以及用法

字符串拷貝

該函數會把“source”指向的字符串拷貝到“destination”指向的字符數組數組中,包括'\0'。在使用時,要求用戶分別傳入目標數組的起始地址和源字符串的起始地址,并返回目標數組的起始地址

#include <stdio.h>
#include <string.h>int main()
{char name[20] = {0};strcpy(name, "zhangsan");printf("%s\n", name);return 0;
}

2.2 函數的原理

“destination”和“source”依次逐字節移動,每次移動前將“source”指向的字符拷貝到“destination”指向的空間,直到將'\0'拷貝到目標數組中為止。

2.3 注意事項

1. 源字符串必須以 '\0' 結束。

2. 會將源字符串中的 '\0' 拷?到?標空間。

3. ?標空間必須?夠?,以確保能存放源字符串。

4. ?標空間必須可修改。比如目標空間是處存放的是一個常字符串或者被const修飾的字符數組。

#include <stdio.h>
#include <string.h>int main()
{const char* p = "abcdef";char arr[] = "bit";strcpy(p, arr);return 0;
}

2.4 模擬實現

char* my_strcpy(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while(*dest++ = *src++);return ret;
}

3. strcat函數的使用和模擬實現

char* strcat(char* destination, const char* source);

3.1 函數功能以及用法

字符串追加

該函數會將“source”指向的字符串追加到“destination”指向的字符數組的后面,原本的'\0'會被覆蓋,源字符串的'\0'會被一起追加到字符數組之后(某些實現中可能是額外添加的'\0')。在使用時,要求用戶分別傳入目標數組的起始地址和源字符串的起始地址,并返回目標數組的起始地址。

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello ";strcat(arr1, "world!");printf("%s\n", arr1);return 0;
}

3.2 函數的原理

首先找到目標數組結尾處的'\0',將其當作目標空間的起始地址的話,接下來的步驟就與strcpy相同了。

3.3 注意事項

1. 源字符串必須以 '\0' 結束。

2. ?標字符串中也得有 \0 ,否則沒辦法知道追加從哪?開始。

3. ?標空間必須有?夠的?,能容納下源字符串的內容。

4. ?標空間必須可修改。

5. 字符串自己給自己追加可能會出錯。

#include <stdio.h>
#include <string.h>int main()
{char arr[20] = "hello";strcat(arr, arr);printf("%s\n", arr);return 0;
}

在第一個字符拷貝結束時,arr結尾的'\0'就被覆蓋了,這時,strcat函數就不知道追加應該何時停止。?

3.4 模擬實現

char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while(*dest){dest++;}while(*dest++ = *src++);return ret;
}

4. strcmp函數的使用和模擬實現

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

4.1 函數功能以及用法

字符串比較

C語言標準規定:

第?個字符串?于第?個字符串,則返回?于0的數字 。

第?個字符串等于第?個字符串,則返回0 。

第?個字符串?于第?個字符串,則返回?于0的數字。

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "zhangsan";char arr2[] = "zhangsanfeng";int ret = my_strcmp(arr1, arr2);if(ret < 0)printf("<\n");else if(ret == 0)printf("=\n");elseprintf(">\n");return 0;
}

4.2 函數的原理

按下標依次比較兩個字符串元素的ascll碼值。

4.3 注意事項

好像沒什么好注意的。

4.4 模擬實現

int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while(*str1 == *str2){if(*str1 == '\0')return 0;str1++;str2++;}return (*str1 - *str2);
}

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

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

相關文章

基于SSM醫院電子病歷管理系統的設計與實現(源代碼+數據庫腳本+萬字文檔+PPT)

系統介紹 醫院電子病歷管理系統主要是借助計算機&#xff0c;通過對醫院電子病歷管理系統所需的信息管理&#xff0c;增加用戶的選擇&#xff0c;同時也方便對廣大用戶信息的及時查詢、修改以及對用戶信息的及時了解。醫院電子病歷管理系統 對用戶帶來了更多的便利&#xff0c…

Python GUI自動化定位代碼參考

一、pyautogui原始邏輯 import pyautogui # 獲取指定圖片在屏幕上的位置 image_path path/to/image.png target_position pyautogui.locateCenterOnScreen(image_path) if target_position is not None: # 獲取偏移量 offset_x 10 offset_y 10 # 計算實際點…

一文讀懂ZKFair PFP-CyberArmy的參與價值與潛力

3月2日&#xff0c;ZKFair PFP-CyberArmy 將在 Element 上正式開始Public Sale。

文件基礎和文件fd

文章目錄 預備知識C語言的文件接口系統調用文件fd 正文開始前給大家推薦個網站&#xff0c;前些天發現了一個巨牛的 人工智能學習網站&#xff0c; 通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。 點擊跳轉到網站。 預備知識 我們平時說文件就是說文件里…

1_Springboot(一)入門

Springboot&#xff08;一&#xff09;——入門 本章重點&#xff1a; 1.什么是Springboot; 2.使用Springboot搭建web項目&#xff1b; 一、Springboot 1.Springboot產生的背景 Servlet->Struts2->Spring->SpringMVC&#xff0c;技術發展過程中&#xff0c;對使…

大模型量化技術原理-SmoothQuant

近年來&#xff0c;隨著Transformer、MOE架構的提出&#xff0c;使得深度學習模型輕松突破上萬億規模參數&#xff0c;從而導致模型變得越來越大&#xff0c;因此&#xff0c;我們需要一些大模型壓縮技術來降低模型部署的成本&#xff0c;并提升模型的推理性能。 模型壓縮主要分…

強化學習(六)時序差分

時序差分&#xff08;TD&#xff09;是強化學習的核心&#xff0c;其是蒙特卡羅&#xff08;MC&#xff09;和動態規劃&#xff08;DP&#xff09;的結合。 1、TD 預測 TD 和 MC 都是利用經驗來解決預測問題。一種非平穩環境的一般訪問蒙特卡羅方法是 V ( S t ) ← V ( S t …

Python GUI開發庫之nicegui使用詳解

概要 在 Python 中,創建圖形用戶界面(GUI)應用程序通常需要大量的代碼和時間。然而,隨著 Python 生態系統的不斷發展,出現了一些簡化 GUI 開發過程的工具和庫。其中之一就是 NiceGUI 庫。本文將深入探討 NiceGUI 庫的功能、用法以及如何利用它來創建漂亮而功能豐富的 GUI…

如何使用css實現一個加載動畫

如何使用css實現一個加載動畫 有四個點 初始化為同一個顏色 每個階段 不同的透明度 刷新也不會影響初始化 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthd…

List 集合遍歷過程中刪除元素避坑指南。

文章目錄 1. 遍歷2. 遍歷過程中刪除元素2.1 for 簡單循環正向遍歷方式2.2 for 簡單循環反向遍歷方式2.3 foreach 方式遍歷刪除2.4 Iterator的remove()方法2.5 <font color green> removeIf() &#xff08;推薦&#xff09;<green>2.6 Strem 方式 作為一名后端開發…

python之計算CPI

CPI&#xff0c;即消費者物價指數&#xff08;Consumer Price Index&#xff09;&#xff0c;是一個反映居民家庭一般所購買的消費品和服務項目價格水平變動情況的宏觀經濟指標。它是在特定時段內度量一組代表性消費商品及服務項目的價格水平隨時間而變動的相對數&#xff0c;通…

網絡測試相關

前言 網絡測試通常是指在網絡環境比較復雜&#xff0c;而且有較多限制時&#xff0c;就需要清楚網絡的走向和途徑的節點&#xff0c;便于在出現問題時進行排查和優化網絡性能&#xff0c;相關知識大多是計算機網絡的 測試工具 抓包 wireshark 路由探測 traceroute/tracert 這…

云快充充電樁系統設計書

充電樁系統設計書 一、系統設計概述 隨著新能源汽車市場的快速發展&#xff0c;充電樁作為電動汽車的重要配套設施&#xff0c;其市場需求日益增長。本系統旨在提供一套穩定、高效、易用的充電樁解決方案&#xff0c;以滿足市場上新能源充電樁的主流需求。通過實現云快充V1.6協…

nginx使用詳解--動靜分離

什么是動靜分離&#xff1f; 為了提高網站的響應速度&#xff0c;減輕程序服務器&#xff08;Tomcat&#xff0c;Jboss等&#xff09;的負載&#xff0c;對于靜態資源&#xff0c;如圖片、js、css等文件&#xff0c;可以在反向代理服務器中進行緩存&#xff0c;這樣瀏覽器在請…

如何選擇激活函數?

選擇神經網絡的激活函數是一個重要的決策&#xff0c;因為激活函數的選擇會影響到網絡的收斂速度以及能否有效地訓練。不同的激活函數適用于不同的任務和網絡架構。以下是選擇激活函數時可以考慮的一些指導原則和常用的激活函數&#xff1a; 指導原則 問題類型&#xff1a; 二…

LLM小記

RAG 參考 檢索增強生成(RAG)概念及優化 主流模型 llama系列 1. 背景&#xff1a;模型參數量級的積累&#xff0c;或者訓練數據的增加&#xff0c;哪個對性能提升幫助更大&#xff1f; 最近的 “Training Compute-Optimal Large Language Models” 這篇論文提出一種縮放定…

Java:PDF圖片抽取的兩種方法

圖片和PDF是我們日常生活和工作中經常接觸到的文檔格式。PDF是人們日常使用最多的跨平臺文檔&#xff0c;是一種用獨立于應用程序、硬件、操作系統的方式呈現文檔的文件格式。每個PDF文件包含固定布局的平面文檔的完整描述&#xff0c;包括文本、字形、圖形及其他需要顯示的信息…

如何利用HubSpot海外獲客系統實現海外市場擴張?

在當今全球化的時代&#xff0c;企業面臨著越來越激烈的競爭&#xff0c;而海外市場則被視為獲取更多增長機會的重要途徑之一。針對這一挑戰&#xff0c;企業需要建立一個完整的海外獲客系統&#xff0c;而HubSpot軟件的應用則成為了關鍵。作為HubSpot的合作伙伴&#xff0c;我…

librtmp源碼分析

閱讀了librtmp的源碼&#xff0c;簡單記錄下。 首先補充下AMF格式基本知識 1 AMF格式 AMF是Action Message Format(動作消息格式)的簡寫&#xff0c;它是一種二進制的數據格式。它的設計是為了把actionscript里面的數據(包括Object, Array, Boolean, Number等)序列化成二進制…

jvm 基礎知識和jvm 調優

類裝載分為以下 5 個步驟&#xff1a; 加載&#xff1a;根據查找路徑找到相應的 class 文件然后導入&#xff1b; 檢查&#xff1a;檢查加載的 class 文件的正確性&#xff1b; 準備&#xff1a;給類中的靜態變量分配內存空間&#xff1b; 解析&#xff1a;虛擬機將常量池中的符…