【C語言】str類與men庫函數的實現(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)

https://blog.csdn.net/hanjing_1995/article/details/51539583

  1. strcpy

拷貝源字符串到子字符串,包括‘\0’。

代碼實現:

[cpp]?view plaincopy
  1. char*?strcpy(char*?dst,const?char*?src)??
  2. {??
  3. ????assert(src);??
  4. ????char*?ret?=?dst;??
  5. ????while?(*src)??
  6. ????{??
  7. ????????*dst?=?*src;??
  8. ????????src++;??
  9. ????????dst++;??
  10. ????}??
  11. ????*dst?=?'\0';??
  12. ????return?ret;??
  13. }??



2.strncpy:

strncpy與strcpy之間差別在于,strcpy將源字符串全部拷貝到新的字符串中,而strncpy拷貝長度由自己確定。

代碼實現:

[cpp]?view plaincopy
  1. char*?strncpy(char*?dst,?const?char*?src,?int?count)??
  2. {??
  3. ????assert(dst);??
  4. ????assert(src);??
  5. ????char*?ret?=?dst;??
  6. ????while?(count--)??
  7. ????{??
  8. ????????*dst?=?*src;??
  9. ????????dst++;??
  10. ????????src++;??
  11. ????}??
  12. ????*dst?=?'\0';??
  13. ????return?ret;??
  14. }??


3.strcat:

strcat作用是鏈接字符串,即:

str1: hel????str2:lo????則鏈接后為hello。

代碼實現:

[cpp]?view plaincopy
  1. char*?strcat(char*?dst,?char*?src)??
  2. {??
  3. ????assert(dst);??
  4. ????assert(src);??
  5. ????char*?ret?=?src;??
  6. ????while?(*src)??
  7. ????{??
  8. ????????src++;??
  9. ????}??
  10. ????while?(*dst)??
  11. ????{??
  12. ????????*src?=?*dst;??
  13. ????????dst++;??
  14. ????????src++;??
  15. ????}??
  16. ????*dst?=?'\0';??
  17. ????return?ret;??
  18. }??


4.strcmp:

strcmp用來比較字符串長度。

對兩個字符串自左至右逐個字符相比(按ASCII碼值大小比較),直到出現不同的字符或遇到‘\0’為止。如果全部字符相同,則認為相等;若出現不相同的字符,則以第一個不相同的字符的比較結果為準。
如果兩個字符串都由英文字母組成,則有一個簡單的規律:在英文字典中位置在后面的為“大”,還要特別注意:小寫字母比大寫字母“大”。
返回值:
(1)字符串1=字符串2,返回0
(2)字符串1>字符串2,返回一個正整數
(3)字符串1<字符串2,返回一個負整數。

代碼實現:

[cpp]?view plaincopy
  1. int?strcmp(const?char*?dst,?const?char*?src)??
  2. {??
  3. ????assert(dst);??
  4. ????assert(src);??
  5. ????while?(*src&&*dst)??
  6. ????{??
  7. ????????if?(*src?==?*dst)??
  8. ????????{??
  9. ????????????src++;??
  10. ????????????dst++;??
  11. ????????}??
  12. ????????else??
  13. ????????{??
  14. ????????????return?*src?-?*dst?-?'\0';??
  15. ????????}??
  16. ????}??
  17. ????return?*src?-?*dst?-?'\0';??
  18. }??


5.strncmp:

與strcmp區別在于:strcmp是針對整個字符串而言,而strncmp針對指定長度。

但是要注意,如果count比兩者字符串長度都短的話,則要跳出循環結束。當長度大于兩者字符串長度時,仍然可以比較出是否相等。

代碼實現:

[cpp]?view plaincopy
  1. int?strncmp(const?char*?dst,?const?char*?src,size_t?count)??
  2. {??
  3. ????assert(dst);??
  4. ????assert(src);??
  5. ????while?(count--&&*src&&*dst)??
  6. ????{??
  7. ????????if?(*src?==?*dst)??
  8. ????????{??
  9. ????????????src++;??
  10. ????????????dst++;??
  11. ????????}??
  12. ????????else??
  13. ????????{??
  14. ????????????return?*src?-?*dst?-?'\0';??
  15. ????????}??
  16. ????}??
  17. ????return?*src?-?*dst?-?'\0';??
  18. }??


6.strstr:

尋找子字符串,我們在源字符串設置一個指針,用做來當此時確實滿足是子串標志原串的位置,如下面的p。而s1,s2分別用作來遍歷。

代碼實現:

[cpp]?view plaincopy
  1. char*?strstr(const?char*?dst,?const?char*?src)??
  2. {??
  3. ????assert(dst);??
  4. ????assert(src);??
  5. ????char*?s1?=?dst;??
  6. ??
  7. ????char*?p?=?src;??
  8. ????char*?s2?=?p;??
  9. ??
  10. ????while?(*s2)??
  11. ????{??
  12. ????????s1?=?dst;??
  13. ????????s2?=?p;??
  14. ????????while?(*s2?&&?*s1)??
  15. ????????{??
  16. ????????????if?(*s2?==?*s1)??
  17. ????????????{??
  18. ????????????????s1++;??
  19. ????????????????s2++;??
  20. ????????????}??
  21. ????????????else??
  22. ????????????{??
  23. ????????????????p++;???
  24. ????????????????break;??
  25. ????????????}??
  26. ????????}??
  27. ????????if?(*s1?==?'\0')??
  28. ????????{??
  29. ????????????return?p;??
  30. ????????}??
  31. ????}??
  32. ????return?NULL;??
  33. }??


7.memcpy:

strcpy完成字符串的拷貝,而對于非字符串類的,卻要用memcpy完成內存拷貝。

代碼實現:

[cpp]?view plaincopy
  1. void*?memcpy(void*?dst,?const?void*?src,?size_t?count)??
  2. {??
  3. ????assert(dst);??
  4. ????assert(src);??
  5. ????char*?dst_?=?(char*)dst;??
  6. ????char*?src_?=?(char*)src;??
  7. ????while?(count--)??
  8. ????{??
  9. ????????*dst_++?=?*src_++;??
  10. ????}??
  11. ????//即使此時count不為0,但是當我們將原數拷貝到新的數據結束,那也要結束程序。??
  12. ????*dst_?=?'\0';//必須加上結束標志,否則會亂碼??
  13. ????return?dst;??
  14. }??


8.memmove:

memmove在于它可解決內存重疊問題。

如:將1,2,3,4,5,6,7,8中的1,2,3,4移動到3,4,5,6位置。那么則仍然按照memcpy則會,將1移動到3處,2移動到4處,再準備移動3時發現此時的3已經由于被移動到此處的1覆蓋而丟失。4同理。這就是memmove的優勢所在。我們分情況即可解決。

代碼實現:

[cpp]?view plaincopy
  1. void?memmove(void*?dst,?const?void*?src,?size_t?count)??
  2. {??
  3. ????assert(dst);??
  4. ????assert(src);??
  5. ????char*?dst_?=?(char*)dst;??
  6. ????char*?src_?=?(char*)src;??
  7. ????if?(dst_?>?src_&&dst?<?dst_?+?count)??
  8. ????{??
  9. ????????while?(count--)??
  10. ????????{??
  11. ????????????*(dst_+count)?=?*(src_+count);??
  12. ????????????dst_++;??
  13. ????????????src_++;??
  14. ????????}??
  15. ????}??
  16. ????else??
  17. ????{??
  18. ????????while?(count--)??
  19. ????????{??
  20. ????????????*dst_?=?*src_;??
  21. ????????????dst_++;??
  22. ????????????src_++;??
  23. ????????}??
  24. ????}??
  25. ????*dst_?=?'\0';??
  26. ????return?dst;??
  27. }??


本文出自 “Han Jing's Blog” 博客,請務必保留此出處http://10740184.blog.51cto.com/10730184/1765040

個人分類:?C語言

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

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

相關文章

【筆試常考】C語言:深度剖析strlen,sizeof

https://blog.csdn.net/hanjing_1995/article/details/51539532在之前的博客中&#xff0c;我也探索過strlen,sizeof區別&#xff0c;詳情可見博客http://10740184.blog.51cto.com/10730184/1705820。關于strlen,sizeof均可求字符串長度&#xff0c;這兩者是筆試面試常考的知識…

vim環境配置 +vimplus配置

vim配置 參考網站&#xff1a;傳送門 這個網站詳細說明了vim配置的命令&#xff0c;我挑選了我想要用的部分&#xff0c;自己配置了一下。 配置vim的文件有兩個&#xff0c;一個是/etc/vim/vimrc 這個是系統配置文件&#xff0c;修改這個文件將會修改所有用戶的vim環境&…

劍指offer面試題:替換空格

https://blog.csdn.net/yanxiaolx/article/details/52235212題目&#xff1a;請實現一個函數&#xff0c;把字符串中的每個空格替換成“%20”。例如輸入“We are happy.”&#xff0c;則輸出“We%20are%20happy.”。解析&#xff1a;時間復雜度為O(n)的解法。完整代碼及測試用例…

數據庫原理及應用【一】引言

什么是數據庫&#xff1a;一個大規模的集成的數據集合 作用&#xff1a;描述現實世界的實體(entities)以及實體之間的關系 管理數據庫的系統軟件&#xff1a;DBMS 文件是一個平滑的字符流&#xff0c;無法完成信息的檢索和管理 數據&#xff08;data&#xff09;:用來描述現…

Linux命令【三】gcc編譯+靜態庫+動態庫+makefile+gdb調試

用C編譯器編譯源文件&#xff1a;gcc 源文件 -o 可執行文件名 詳細步驟&#xff1a; gcc -E a.c -o a.i預處理器將頭文件展開&#xff0c;宏替換&#xff0c;去掉注釋gcc -S a.i -o a.s編譯器將C文件變成匯編文件gcc -c a.s -o a.o匯編器將會變文件變成二進制文件gcc a.o -o a…

用c++模擬實現一個學生成績管理系統

https://blog.csdn.net/yanxiaolx/article/details/53393437題目&#xff1a;用c模擬實現一個學生成績的信息管理系統&#xff0c;要求能添加、刪除、修改、查看和保存學生的信息等功能 源代碼如下:[cpp] view plaincopy#define _CRT_SECURE_NO_WARNINGS #include<iostr…

Linux命令【四】文件+虛擬內存+常用系統函數

File*其實是一個結構體 文件描述符FD&#xff1a;索引到對應的磁盤文件文件讀寫位置指針FP_POS&#xff0c;如果同時讀寫需要注意文件指針的位置I/O緩沖區BUFFER&#xff1a;保存內存指針&#xff0c;默認大小是8kb&#xff0c;用于減小我們對硬盤操作的次數。因為我們對硬盤的…

Python3列表

操作&#xff1a;索引、切片、加、乘、檢查成員、確定序列長度、確定最大最小元素 定義&#xff1a; 列表名 [元素]下標列表名[x] 截取:列表名[x:y] 更新&#xff1a; list[x]y 或者使用append()方法添加列表項刪除&#xff1a; del list[x]常用操作&#xff1a; 截取與…

Linux驚群效應詳解(最詳細的了吧)

https://blog.csdn.net/lyztyycode/article/details/78648798?locationNum6&fps1 linux驚群效應詳細的介紹什么是驚群&#xff0c;驚群在線程和進程中的具體表現&#xff0c;驚群的系統消耗和驚群的處理方法。1、驚群效應是什么&#xff1f;驚群效應也有人叫做雷鳴群體效應…

epoll原理詳解(最清晰)

https://blog.csdn.net/lyztyycode/article/details/79491419我只是把內容搬運過來做個記錄&#xff0c;方便自己以后回頭看。第一部分&#xff1a;select和epoll的任務關鍵詞&#xff1a;應用程序 文件句柄 用戶態 內核態 監控者要比較epoll相比較select高效在什么地方&#x…

Linux命令【五】系統函數

系統文件函數 stat函數 指針如果沒有const一般表示傳出參數&#xff0c;如果加const表示傳入參數 struct stat dev_t st_dev文件設備編號ino_t st_ino節點 inode號是唯一的&#xff0c;每個inode節點的大小一般是128字節活著256字節&#xff0c;一般文件每2KB就設置一個ino…

生產者-消費者模型的兩種實現方式

https://www.cnblogs.com/caolicangzhu/p/7086176.html本文主要來總結生產者-消費者模型的代碼實現,至于其原理,請大家自行百度. 一、基于鏈表的生產-消費模型(條件變量)我們以鏈表為例,生產者進行頭部插入,消費者進行頭部刪除,因此,先將鏈表相關操作封裝為LinkList.h,具體代碼…

Linux系統【一】CPU+MMU+fork函數創建進程

切板中的內容輸出到文件### 進程相關概念 程序&#xff1a;編譯好的二進制文件&#xff0c;在磁盤上&#xff0c;不占用系統資源&#xff08;不包括磁盤&#xff09;。&#xff08;劇本&#xff09; 進程&#xff1a;占用系統資源&#xff0c;是程序的一次運行。&#xff08;戲…

Ubuntu卸載軟件

用過使用dpkg軟件管理工具得到所有已經安裝的軟件&#xff0c;如果不清楚軟件的全名可以使用grep命令進行查找 然后再使用sudo apt-get remove --purge 軟件名卸載軟件&#xff08;--purge參數會刪除配置文件&#xff0c;刪的干凈一些&#xff09; 例如&#xff1a;

一個重要且實用的signal---SIGCHLD

https://blog.csdn.net/lyztyycode/article/details/78150805SIGCHLD(修改)因為筆者之前的文章里面有錯誤&#xff0c;今天發現&#xff0c;立馬做個修改。在下面我的一段關于sigchld信號相對于直接調用wait函數的好處時&#xff0c;我說調用wait函數要一直檢測子進程是否執行完…

數據結構實驗之鏈表七:單鏈表中重復元素的刪除

https://blog.csdn.net/blessingxry/article/details/794455111.知識點&#xff1a;逆序建立鏈表&#xff0b;節點刪除 2.題意&#xff1a;按照數據輸入的相反順序&#xff08;逆位序&#xff09;建立一個單鏈表&#xff0c;并將單鏈表中重復的元素刪除&#xff08;值相同的元素…

Python3函數和代碼復用

函數的定義 def 函數名([參數列表]):注釋函數體注意事項 函數形參不需要聲明類型&#xff0c;可以使用return語句在結束函數執行的同時返回任意類型的值&#xff0c;函數返回值類型與return語句返回表達式i的類型一致 即使該函數不需要接受任何參數&#xff0c;也必須保留一堆…

一文說盡C++賦值運算符重載函數(operator=)

http://www.cnblogs.com/zpcdbky/p/5027481.html在前面&#xff1a;關于C的賦值運算符重載函數(operator)&#xff0c;網絡以及各種教材上都有很多介紹&#xff0c;但可惜的是&#xff0c;內容大多雷同且不全面。面對這一局面&#xff0c;在下在整合各種資源及融入個人理解的基…

Python a和a[:]的區別

簡單來講a[:]是深復制&#xff0c;a是淺復制&#xff0c;相當于賦值a的話是賦值了指針&#xff0c;賦值a[:]相當于復制了a對應的那段空間 例如&#xff1a; a [1,1,1,1,1,1]for x in a:if x1:a.remove(x)print(a)運行結果&#xff1a; remove操作是移除序列中第一個x元素。…

約瑟夫環(c語言程序完整版)

https://blog.csdn.net/m_hahahaha1994/article/details/51742453約瑟夫環&#xff08;約瑟夫問題&#xff09;是一個數學的應用問題&#xff1a;已知n個人&#xff08;以編號1&#xff0c;2&#xff0c;3…n分別表示&#xff09;圍坐在一張圓桌周圍。從編號為k的人開始報數&am…