<string.h>中部分庫函數的模擬實現

在這里插入圖片描述

前言

嗨,我是firdawn,本章將簡單介紹,<string.h>中部分庫函數的模擬實現,如strncpy,strncat,memcpy,memmove。在本文片末,還講簡單介紹判斷機器大小端的函數實現,下面是本章的思維導圖,那么,讓我們開始吧!
在這里插入圖片描述

一,模擬實現strncpy

1.1 strncpy的介紹

srtncpy的介紹參考cplusplus:strncpy,如下圖是該介紹的機器翻譯,有些地方可能翻譯不準。從圖中我們可以知道,strncpy用于將一個字符串拷貝到另一個字符數組中。
1.strncpy被包含在<string.h>這個頭文件中。
2.它的函數聲明為:char * strncpy ( char * destination, const char * source, size_t num );
3.其中包含三個參數,destination表示被拷貝的字符要放的目的地,source表示要拷貝到字符串的起始地址,num表示要拷貝幾個字符。
4.返回值,返回值的類型為 char*,返回的是destination的值。
在這里插入圖片描述

1.2 strncpy的使用

具體使用如圖1.2-a
在這里插入圖片描述
這里src數組被放入了4個字符。

1.3 實現strncpy

#include <string.h>#include <assert.h>char* my_strncpy(char* dest, const char* src, size_t num){assert(dest && src);char* p1 = dest;const char* p2 = src;//拷貝num個字符int i = 0;for (i = 0; i < num; i++){*p1++ = *p2++;}*p1 = '\0';return dest;}//模擬實現strncpyint main(){char arr1[20] = "a cute cat";char arr2[20] = { 0 };my_strncpy(arr2, arr1, 6);return 0;}

二,模擬實現strncat

2.1 strncat的介紹

srtncat的介紹參考cplusplus:strncat,同樣的,因為該網站是國外的一個網站,所以有些地方可能翻譯不準。如下圖,是該介紹的機器翻譯,從圖中我們可以知道,strncat用于將一個字符串拼接到另一個字符數組的末尾。
在這里插入圖片描述
1.使用函數所需的頭文件:strncat 被包含在<string.h>這個頭文件中。
2.函數聲明:char * strncat ( char * destination, const char * source, size_t num );
3.參數:destination表示被拼接的字符要放的目的數組,source表示要被拼接到字符串的起始地址,num表示要拼接幾個字符。
4.返回值:返回值的類型為 char*,返回的是destination的值。

2.2 strncat的使用

在這里插入圖片描述
如上圖,dest數組中被拼接了5個字符。

2.3 實現strncat

#include <string.h>#include <assert.h>char* my_strncat(char* dest, const char* src, size_t num){assert(dest && src);char* p1 = dest;const char* p2 = src;//讓p1指向dest數組的'\0'位置while (*p1){p1++;}//拷貝num個字符int i = 0;for (i = 0; i < num; i++){*p1++ = *p2++;}*p1 = '\0';return dest;}//模擬實現strncatint main(){char arr1[20] = "a cute cat";char arr2[20] = "I have ";my_strncat(arr2, arr1, 6);return 0;}

三,模擬實現memcpy

3.1 memcpy的介紹

memcpy的介紹參考cplusplus:memcpy,如下圖,是該介紹的機器翻譯,從圖中我們可以知道,memcpy用于拷貝內存塊的數據,拷貝大小單位是字節,不過,對于重疊內存塊的拷貝,標準是未定義的。
在這里插入圖片描述

1.使用函數所需的頭文件:memcpy 被包含在<string.h>這個頭文件中。
2.函數聲明:void * memcpy ( void * destination, const void * source, size_t num );
3.參數:destination表示被拷貝的數據要放的目的數組,source表示要被拷貝的數據的起始地址,num表示要拷貝幾個字節。
4.返回值:返回值的類型為 void*,返回的是destination的值。

3.2 memcpy的使用

在這里插入圖片描述
如圖,我們第一次將src數組中的數據拷貝到了dest數組中,第二次將src1數組中的數據拷貝到了dest1中。

3.3 實現memcpy

#include <assert.h>void* memcpy(void* dest, const void* src, size_t num){assert(dest && src);char* p1 = (char*)dest;char* p2 = (char*)src;int i = 0;for (i = 0; i < num; i++){*p1++ = *p2++;}return dest;}//模擬實現memcpyint main(){char arr1[20] = "beautiful girl";char arr2[20] = { 0 };memcpy(arr2, arr1, sizeof(arr1));return 0;}

四,模擬實現memmove

4.1 memmove的介紹

memmove的介紹參考cplusplus:memmove,如下圖,是該介紹的機器翻譯,從圖中我們可以知道,memmove用于拷貝內存塊的數據,拷貝大小單位是字節,不過,它支持重疊內存塊的拷貝,這在標準中是明確規定了的。
在這里插入圖片描述

4.2 memmove的使用

在這里插入圖片描述
在上圖中,我們將src[ 2 ]的數據拷貝到了src后面,這里拷貝到內存塊重疊了

4.3 實現memmove

#include <string.h>#include <assert.h>void* my_memmove(void* dest, const void* src, size_t num){assert(dest && src);const char* cur = (char*)src;char* p1 = NULL;if (dest > src){p1 = (char*)dest + num - 1;for (cur = (char*)src + num - 1; cur >= (char*)src; cur--){*p1-- = *cur;}}else{p1 = (char*)dest;for (cur = (char*)src; cur <= (char*)src + num - 1; cur++){*p1++ = *cur;}}return dest;}//模擬實現memmoveint main(){char arr1[30] = "a beautiful girl";my_memmove(arr1 + 2, arr1, sizeof(arr1));return 0;}

五,機器大小端的判斷

5.1 簡單介紹大小端

大小端(Endian)是計算機數據存儲的一種方式。在計算機中,數據存儲的最小單位是字節(byte),每個字節由8個二進制位組成。在一個多字節數據(如整數、浮點數等)在內存中存儲時,需要決定字節的排列順序。

大端存儲(Big Endian):字節的高位保存在低地址,字節的低位保存在高地址。即最高有效字節(Most Significant Byte)存儲在最低內存地址,最低有效字節(Least Significant Byte)存儲在最高內存地址。

小端存儲(Little Endian):字節的高位保存在高地址,字節的低位保存在低地址。即最低有效字節(Least Significant Byte)存儲在最低內存地址,最高有效字節(Most Significant Byte)存儲在最高內存地址。

不同的計算機架構和處理器可能采用不同的存儲方式。例如,x86架構的計算機通常使用小端存儲,而PowerPC架構的計算機通常使用大端存儲。為了在不同架構的計算機之間進行數據交換,通常需要進行字節序轉換操作。

5.2 大小端的函數實現

int CheckSystem(){int num = 1;return *((char*)&num);}//編寫判斷大小端程序int main(){int ret = CheckSystem();//小段返回1,大段返回0return 0;}

在這里插入圖片描述

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

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

相關文章

VSCode SAP Systems配置HTTPS訪問SAP

第一次訪問提示&#xff0c;Self-Signed 證書 解決辦法&#xff1a;https訪問SAP Fiori網站&#xff0c;導出SSL證書為DER格式保存到硬盤上 雙擊DER文件&#xff0c;導入到系統 退出VSCode&#xff0c;再次啟動 Test Connection, 提示 The system URL is using a hostname …

服務器攻防-中間件安全,weblogic(沒怎么搞懂)

1.weblogic-工具 jboss 1.弱口令 直接輸入admin就就去了 2.反序列化&#xff08;不是很懂java) jenkins glassfish 讀密碼文件 讀取 就可以知道它的密碼 我們就可以寫腳本

使用DataGrip連接跳板機后再連接遠程服務器的mysql數據庫

相比配置本地數據庫就是多了一步SSH/SSL配置。 添加新的mysql連接&#xff0c;選擇SSH/SSL&#xff0c;勾選Use SSH tunnel&#xff1a; 點擊右邊的…配置跳板機連接&#xff0c;輸入賬號密碼&#xff0c;然后保存&#xff1a; 接著配置General&#xff0c;里面填上要連接的數…

一款數字化管理平臺源碼:云MES系統(附架構圖、流程)技術架構:springboot + vue-element-plus-admin

制造生產企業打造數字化生產管控的系統&#xff0c;從原材料、生產報工、生產過程、質檢、設備、倉庫等整個業務流程的管理和控制&#xff0c;合理安排生產計劃、實時監控生產、優化生產工藝、降低不良產出和運營成本&#xff1b; 技術架構&#xff1a;springboot vue-elemen…

DHT11獲取數據傳輸到PC端

1.DHT11的時序數據 a : dht 1 b &#xff1a;dht 0延時30ms c&#xff1a; dht 1 卡d點&#xff1b;while(dht1); 卡e點 while(!dht) 卡f點&#xff1a;while(dht) 卡g點&#xff1a;while(!dht) 有效數據都是高電平&#xff0c;持續時間不一樣&#xff0c;50us讀&#…

Go語言實現人臉檢測(Go的OpenCV綁定庫)

文章目錄 OpenCVGithub官網安裝環境變量 Go的OpenCV綁定庫Github文檔安裝搜索視頻設備ID顯示視頻檢測人臉 OpenCV Github https://github.com/opencv/opencv/ 官網 https://opencv.org/ 安裝 brew install opencv brew upgrade opencv安裝目錄 cd /usr/local/opt/opencv…

子比主題ACG美化插件[全開源]

WordPress插件是一種可以擴展和增強WordPress網站功能的應用程序。子比主題ACG美化插件聽起來像是一個專門為ACG&#xff08;動畫、漫畫、游戲&#xff09;愛好者設計的美化插件&#xff0c;它可能包含多種功能來改善網站的外觀和用戶體驗。 內置功能開關100意味著這個插件提供…

基于CNN卷積神經網絡的金融數據預測matlab仿真,對比BP,RBF,LSTM

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.核心程序 4.本算法原理 4.1 反向傳播網絡&#xff08;BP&#xff0c;多層感知器MLP&#xff09; 4.2 徑向基函數網絡&#xff08;RBF&#xff09; 4.3 卷積神經網絡&#xff08;CNN&#xff09; 4.4 長短期記憶網…

六(1)、RTKLIB源碼解析 — rnx2rtkp.c

目錄 一、前言 二、main中的參數說明 三、main中的代碼解讀 3.1 總體邏輯框架

計算機網絡套接字知識(非常詳細)從零基礎入門到精通

本節重點 認識IP地址, 端口號, 網絡字節序等網絡編程中的基本概念; 學習socket api的基本用法; 一、預備知識 1.理解源IP地址和目的IP地址 ?在IP數據包頭部中&#xff0c;有兩個IP地址&#xff0c;分別叫做源IP地址和目的IP地址。 思考: 我們光有IP地址就可以完成通信了…

Kotlin Flow應用舉例,launchIn 和collect用法及區別

launchIn 和 collect 都可以用于處理 MutableStateFlow<Message> 消息流&#xff0c;但它們有不同的用途和使用場景。 collect 用于在協程中收集消息流的最新值。它會一直監聽消息流&#xff0c;并在每次消息流的值發生變化時執行指定的代碼塊。 launchIn 用于在協程作…

【30天精通Prometheus:一站式監控實戰指南】第7天:postgres_exporter從入門到實戰:安裝、配置詳解與生產環境搭建指南,超詳細

親愛的讀者們&#x1f44b; ??歡迎加入【30天精通Prometheus】專欄&#xff01;&#x1f4da; 在這里&#xff0c;我們將探索Prometheus的強大功能&#xff0c;并將其應用于實際監控中。這個專欄都將為你提供寶貴的實戰經驗。&#x1f680; ??Prometheus是云原生和DevOps的…

Java基礎之異常(簡單易懂)

異常 1.JAVA異常體系 &#xff08;1&#xff09;Throwable類(表示可拋)是所有異常和錯誤的超類&#xff0c;兩個直接子類為Error和Exception,分別表示錯誤和異常;其中異常類Exception又分為運行時異常和非運行時異常&#xff0c;這兩個異常有很大區別&#xff0c;運行時異常也…

代碼隨想錄算法訓練營第三十一天| 貪心算法理論基礎、LeetCode455.分發餅干、LeetCode376. 擺動序列 、LeetCode53. 最大子序和

貪心算法理論基礎&#xff1a; 貪心算法沒有類似遞歸、回溯的套路。主要的思想可以理解為&#xff1a;用局部最優找全局最優。 #LeetCode 455. Assign Cookies #LeetCode 455. 視頻講解&#xff1a;貪心算法&#xff0c;你想先喂哪個小孩&#xff1f;| LeetCode&#xff1a;4…

魯教版六年級數學下冊-筆記

文章目錄 第五章 基本平面圖形1 線段、射線、直線2 比較線段的長短3 角4 角的比較5 多邊形和圓的初步認識第六章 整式的乘除1 同底數冪的乘法2 冪的乘方與積的乘方3 同底數冪的除法4 零指數冪與負整數指數冪5 整式的乘法6 平方差公式7 完全平方公式8 整式的除法 第七章 相交線與…

全域運營是割韭菜嗎?常見套路有哪些?

隨著全域運營賽道的全面開啟&#xff0c;全域運營服務商和全域運營系統的數量迅速增加&#xff0c;持續激發賽道活力的同時&#xff0c;也讓一些試圖用全域運營割韭菜的人有了可趁之機。 值得慶幸的是&#xff0c;由于當前全域運營賽道剛興起不久&#xff0c;因此&#xff0c;割…

Python | Leetcode Python題解之第110題平衡二叉樹

題目&#xff1a; 題解&#xff1a; class Solution:def isBalanced(self, root: TreeNode) -> bool:def height(root: TreeNode) -> int:if not root:return 0leftHeight height(root.left)rightHeight height(root.right)if leftHeight -1 or rightHeight -1 or a…

C++青少年簡明教程:If選擇語句

C青少年簡明教程&#xff1a;If選擇語句 C中選擇語句的語法是&#xff1a; if (條件) { 條件成立時需要執行的語句... } [else { 條件不成立時需要執行的語句... }] 說明&#xff1a; if后面使用一個括號&#xff0c;括號里是條件——關系表達式。 所謂的關系表達式就是判…

5.24學習記錄

[FSCTF 2023]ez_php2 比較簡單的pop鏈 <?php highlight_file(__file__); Class Rd{public $ending;public $cl;public $poc;public function __destruct(){echo "All matters have concluded";die($this->ending);}public function __call($name, $arg){for…

E1載波:一種2.048Mbps速率的PCM載波

E1載波的基本幀由32個子信道組成 幀長為256個bit,分為32個相等時隙&#xff0c;一個時隙為8個bit。256/328 時隙的編號為CH0~CH31 全幀包含256位,且每一幀用 125us時間傳送 E1載波支持的數據傳輸效率為2.048Mbps&#xff0c;用PCM編碼&#xff08;即 256bit/125us2.048Mbps…