【C語言每日題解】用函數來模擬實現strlen()、strcpy()、strcmp()、strcat()

🥰歡迎關注?輕松拿捏C語言系列,來和 小哇 一起進步!?


學習了函數后,老師讓我們用函數來實現上面這四個字符串函數。

我們首先來了解一下這四個字符串函數:

1.strlen函數

用于獲取字符串長度(不包括末尾的空字符'\0')

函數原型:size_t strlen(const char *str);

參數str是一個指向字符串的指針。

返回值:返回字符串的長度(無符號整數)。

strlen函數使用例子,

#include <stdio.h>  
#include <string.h>  int main() {  char str[] = "Hello, World!";  printf("%d\n", strlen(str));  // 輸出:13  return 0;  
}

?接下來讓我們用函數來實現strlen函數的功能

int Strlen(char ch[])
{int count = 0;while (*ch!='\0')//可以只寫成 *ch,當*ch為'\0'時條件為假{count++;ch++;}return count;
}
int main()
{char ch[100];scanf("%99s", ch);//讀取最多99個字符以防止緩沖區溢出printf("打印數組ch:\n");printf("%s\n", ch);//模擬調用strlenprintf("數組ch中輸入的字符個數為:%d\n", Strlen(ch));return 0;
}

還可以用遞歸函數來寫一下

int DiguiStrlen(char* ch)
{if ('\0' == *ch)return 0;elsereturn 1 + DiguiStrlen(ch + 1);
}

?2.strcpy函數

用于將源字符串中的內容復制到目標字符串中。

函數原型:char *strcpy(char *dest, const char *src);

參數dest是目標字符串的指針,src是源字符串的指針。

返回值:返回目標字符串的指針。

注意:使用strcpy時必須確保目標字符串有足夠的空間來存儲源字符串,包括末尾的空字符 '\0'。否則,可能會導致緩沖區溢出,這是一個常見的安全漏洞。

strcpy函數使用例子,

#include <stdio.h>  
#include <string.h>  
int main() 
{  char dest[20];  char src[] = "Hello, World!";  strcpy(dest, src);  printf("dest: %s\n", dest);  // 輸出:dest: Hello, World!  return 0;  
}

用函數實現strcpy的功能:

void Strcpy(char* a,char* ch)
{int i = 0;for (i; ch[i]!='\0'; i++)a[i] = ch[i];a[i] = '\0';//給字符數組a后添加\0以確保其能夠正確終止
}
int main()
{char ch[100];char a[100];scanf("%99s", ch);//讀取最多99個字符以防止緩沖區溢出printf("打印數組ch:\n");printf("%s\n", ch);//模擬調用strcpyStrcpy(a, ch);printf("%s\n", a);return 0;
}

注意要在函數中給目標字符數組a的最后添加'\0',我一開始經常忽略這部分,導致每次程序運行打印字符數組a時都打出很多個 燙燙燙 這樣的亂碼,這是內存中其他部分的隨機字節被解釋成字符后的結果。?

3. strcmp函數

比較兩個字符串中對應位置字符的ASCII碼值的大小

函數原型:int strcmp(const char *str1, const char *str2);?

如果str1小于str2,則返回值小于0

如果str1等于str2,則返回值為0

如果str1大于str2,則返回大于0

它是一個字符一個字符地比較,ASCII碼值不同就返回結果;如果兩個字符完全相同就返回0

strcmp函數使用例子,

#include <stdio.h>  
#include <string.h>  
int main() {  char str1[] = "apple";  char str2[] = "banana";  int r= strcmp(str1, str2);  printf("%d\n", r);  // 輸出:-1 return 0;  
}

用函數實現strcmp的功能,

int Strcmp(char ch[],char* b,int len_ch,int len_b)
{int len = 0;//兩個字符串長度不同時,先取相同長度if (len_ch > len_b)len = len_b;elselen = len_ch;int i = 0;//比較相同長度部分for (i; i < len; i++){if (ch[i] > b[i])return 1;else if (ch[i] < b[i])return -1;//當前比較字符相同時,continue跳過后面//進入下一次循環比較下一個字符elsecontinue;}if (ch[i] == '\0' && b[i] == '\0')return 0;else if (ch[i] == '\0' && b[i] != '\0')return -1;elsereturn 1;}
int main()
{char ch[100];char b[] = "grape";scanf("%99s", ch);//讀取最多99個字符以防止緩沖區溢出printf("打印數組ch:\n");printf("%s\n", ch);//模擬調用strcmpprintf("%d\n", Strcmp(ch,b,Strlen(ch),Strlen(b)));return 0;
}

4. strcat函數

將源字符內容拼接到目標字符末尾。

原型:char *strcat(char *dest, const char *src);

參數dest是目標字符串的指針,src是源字符串的指針。

返回值:返回目標字符串的指針。

注意:使用strcat時必須確保目標字符串有足夠的空間來存儲追加后的字符串,包括末尾的空字符 '\0'。否則,可能會導致緩沖區溢出

strcat函數使用例子,

#include <stdio.h>  
#include <string.h>    
int main() {  char dest[100] = "Hello, ";  char src[] = "World!";  strcat(dest, src);  printf("%s\n", dest);  // 輸出:Hello, World!  return 0;  
}

用函數實現strcat的功能:

void Strcat(char ch[], char b[],int len_ch)
{int i = len_ch;for (i; *b != '\0'; i++){ch[i] = *b;//將字符數組b的內容拼接在字符數組ch后面b++;}ch[i] = '\0';
}
int main()
{char ch[100];char b[] = "grape";scanf("%99s", ch);//讀取最多99個字符以防止緩沖區溢出printf("打印數組ch:\n");printf("%s\n", ch);//模擬調用strcatStrcat(ch, b, Strlen(ch));printf("%s\n", ch);return 0;
}

🎉🎉本次的內容結束啦,歡迎有問題評論區討論。

😘💕希望大家能夠三連支持,你們的鼓勵是我前進的動力

🌹🌹謝謝觀看!

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

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

相關文章

【源碼】相親交友系統全新UI/情感測試/婚慶中介/交友系統

【交友】相親交友系統全新UI/情感測試/婚慶中介/交友系統 帶商城&#xff0c;情感測試。 https://www.52codes.cc/codes/qt

從開發板導出根文件系統并修改(Ubuntu)

前面提到過基于ubuntu-base去構建根文件系統基于Ubuntu-base構建根文件系統-CSDN博客&#xff0c;但是有時候我們并不需要重頭開始&#xff0c;可以基于現有的根文件系統做調整。又或者我們直接在出廠的系統上去搭建好自己的運行環境并且編譯出自己想要的程序&#xff0c;現在要…

醫學科技查新中對查新點的撰寫方法!附案例講解!

我國的科技查新工作最早是從醫學領域開始的&#xff0c;始于1985年中國科學院醫學情報所&#xff0c;后來逐步發展到工、農等其 他各個領域。醫學科技查新包括立項查新和成果查新兩個部分&#xff0c;其中醫學立項查新&#xff0c;它是指在醫學科研項目申報開題之前&#xff0c…

Linux上diff命令

diff 是一個 Linux 下的命令行工具&#xff0c;用于比較文本文件或目錄之間的差異。它會逐行比較兩個文件的內容&#xff0c;并輸出它們之間的不同之處。diff 命令通常用于查找文件間的差異&#xff0c;特別是用于比較文件的修改&#xff0c;合并文件或者檢查文件的一致性。 基…

按值傳遞還是按引用傳遞

使用std::ref和std::cref 從 C11 開始&#xff0c;可以讓調用者自行決定向函數模板傳遞參數的方式。如果模板參數被聲明成 按值傳遞的&#xff0c;調用者可以使用定義在頭文件<functional>中的 std::ref()和std::cref()將參數按引用傳遞給函數模板&#xff0c;比如&#…

上海初中生古詩文大會倒計時4個月:單選題真題示例和獨家解析

現在距離2024年初中生古詩文大會還有4個多月時間&#xff0c;備考要趁早&#xff0c;因為知識點還是相對比較多的。這些知識點對于初中語文的學習也是很有幫助的。 今天我們繼續來看10道選擇題真題和詳細解析&#xff0c;以下題目截取自我獨家制作的在線真題集&#xff0c;都是…

取名時,要考慮生肖的影響

親愛的寶寶們&#xff0c;又是一年五一小長假&#xff0c;峰民想大家都在休假吧&#xff01;真幸福&#xff01;峰民每天都在工作&#xff0c;幾乎沒有休過假&#xff0c;因為每天全國各地找我們取名改名客戶是絡繹不絕&#xff0c;峰民雖然也很辛勞&#xff0c;但也很有成就感…

Redis:hash數據類型

文章目錄 hash常用命令hsethgethexistshdelhkeyshvalshmget 壓縮hash和string 本篇總結的是&#xff0c;在Redis中的哈希數據類型 hash 在Redis內部本身&#xff0c;其實就是一種鍵值對的結構&#xff0c;而在key-value的value本身&#xff0c;其實也可以是一種哈希結構 而在…

【c++算法篇】滑動窗口

&#x1f525;個人主頁&#xff1a;Quitecoder &#x1f525;專欄&#xff1a;算法筆記倉 目錄 1.長度最小的子數組2.無重復字符的最長子串3.最大連續1的個數 III4.將 x 減到 0 的最小操作數5.水果成籃6.找到字符串中所有字母異位詞7.串聯所有單詞的子串8.最小覆蓋子串 滑動窗…

李宏毅-Self-attention機制詳解

原視頻鏈接&#xff1a;attention 一. 基本問題分析 1. 模型的input 無論是預測視頻觀看人數還是圖像處理&#xff0c;輸入都可以看作是一個向量&#xff0c;輸出是一個數值或類別。然而&#xff0c;若輸入是一系列向量&#xff0c;長度可能會不同&#xff0c;例如把句子里的…

C 深入指針(4)

目錄 一、字符指針變量 1 初始化 2 與字符串數組的區別 二、數組指針變量 1 初始化 2 二維數組傳參本質 三、函數指針變量 1 初始化 2 用法 四、typedef關鍵字 五、函數指針數組 一、字符指針變量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

機器人非線性阻抗控制系統

機器人非線性控制系統本質上是一個復雜的控制系統&#xff0c;其狀態變量和輸出變量相對于輸入變量的運動特性不能用線性關系來描述。這種系統的形成基于兩類原因&#xff1a;一是被控系統中包含有不能忽略的非線性因素&#xff0c;二是為提高控制性能或簡化控制系統結構而人為…

人形機器人場景應用全解析,2024睿抗 AI ROBOT創新挑戰賽火熱報名中!

人工智能&#xff08;AI&#xff09;已成為推動科技革命和產業變革的關鍵力量。隨著大模型等AIGC技術的迅猛發展&#xff0c;AI正深刻改變我們的生活并重新定義生產方式。越來越多人期望將AI技術從純粹的思維和計算擴展到與物理世界的互動中&#xff0c;即發展具身智能。 為了推…

探索中國文本到視頻AI模型——Vidu

引言 隨著人工智能技術的不斷進步&#xff0c;我們見證了從文本到視頻內容生成的革命。最近&#xff0c;一個名為Vidu的中國文本到視頻AI模型引起了全球的關注。由清華大學和中國AI初創公司聲書科技聯合開發的Vidu&#xff0c;于2024年4月27日宣布&#xff0c;它聲稱能夠生成高…

測試周期記錄

測試周期是軟件開發生命周期中的一個重要環節&#xff0c;它包括單元測試、集成測試、系統測試和驗收測試等階段。本文將詳細介紹測試周期的各個階段及其重要性&#xff0c;幫助讀者更好地理解測試周期在軟件開發過程中的作用。 一、單元測試 單元測試是測試周期中的第一個階段…

個人工控方面收藏網址記錄(持續更新中)

1、OPC類 OPC Foundation GitHub Downloads - Unified Automation (unified-automation.com) 物聯網IoT協議之OPC UA快速入門教程 | 源碼先生的調試人生 (debugself.com) OPC Servers - OPC UA Migration - 100 Solutions by Matrikon (matrikonopc.com) Prosys OPC UA Simu…

k8s coredns配置

1.coredns可根據集群具體數量修改pod數&#xff0c;官方推薦比例為5/1&#xff0c;即有15臺服務器最好是3個pod。 2.coredns會繼承pod所在主機的dns解析,修改了主機的dns解析之后&#xff0c;coredns有一段時間的緩存&#xff0c;重啟coredns才會在集群內部立刻生效該解析。 …

SpringBoot3集成WebSocket

標簽&#xff1a;WebSocket&#xff0c;Session&#xff0c;Postman。 一、簡介 WebSocket通過一個TCP連接在客戶端和服務器之間建立一個全雙工、雙向的通信通道&#xff0c;使得客戶端和服務器之間的數據交換變得更加簡單&#xff0c;允許服務端主動向客戶端推送數據&#xf…

003_PyCharm的安裝與使用

如果你正在學習PyQt&#xff0c;本系列教程完全可以帶你入門直至入土。 所謂從零開始&#xff0c;就是從軟件安裝、環境配置開始。 不跳過一個細節&#xff0c;不漏掉一行代碼&#xff0c;不省略一個例圖。 IDE 開始學習一個編程語言&#xff0c;我們肯定是首先得安裝好它&…

std::funture和std::promise

#include <iostream> #include <thread> #include <future>void calculateResult(std::promise<int>& promiseObj) {// 模擬耗時計算std::this_thread::sleep_for(std::chrono::seconds(2));// 設置結果到 promise 中promiseObj.set_value(42); }i…