C語言之strstr函數的使用和模擬實現

C語言之strstr函數的模擬實現

文章目錄

  • C語言之strstr函數的模擬實現
    • 1. strstr函數的介紹
    • 2. strstr函數的使用
    • 3. strstr的模擬實現
      • 3.1 實現思路
      • 3.2 實現代碼

1. strstr函數的介紹

函數聲明如下:

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

strstr函數是用于在字符串str1中找str2字符串第一次出現的位置,如果找到改位置,則將這個位置返回,找不到則返回一個空指針NULL
strstr函數比較元素時,不包含 \0,以 \0 作為結束的標志

2. strstr函數的使用

#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcadefdef";char arr2[] = "def";char * ret = strstr(arr1, arr2);if (ret != NULL){printf("%s\n", ret);}else{printf("找不到\n");}return 0;
}

如果arr1字符串中是否有arr2 def 這三個字符,必須得是連續的
然后用ret來接收strstr函數的返回值
如果arr1中有出現arr2這個字符串,則返回第一次出現的地址
否則則返回一個空指針
最后繼續判斷是否為空指針,如果不是則打印第一次出現的位置

運行結果如下:
在這里插入圖片描述

3. strstr的模擬實現

3.1 實現思路

假設有兩個字符數組
str1中的字符串為 a b b b c d e f \0
str2中的字符串為 b b c \0
在這里插入圖片描述

當將這兩個字符串傳給strstr函數時,傳入的是首元素地址,所以str1指向字符 a ,str2指向字符 b

  1. 要判斷str1字符串中是否有str2字符串,首先,str1要從第一個元素開始比較,如果從第一個元素就錯了,所以要通過指針偏移的方式來找到第二個元素,如果兩個元素相同,那么str1 和 str2 都偏移一個字節找到下一對要比較的元素

  2. 當指針偏移到第二個元素的時候,當第二遍比較的時候,str1 和 str2 前兩個字符都相同,此時str1指向第三個元素 b ,str2指向第二個元素 b ,然后str1 和 str2 都偏移一個字節找到下一個元素, str1 找到第四個元素 b,str2 找到第三個元素 c,此時兩個元素不相同,str1 得回到比較時的位置,str2 得回到起始位置

3.所以我們可以定義兩個指針變量用來記錄str1比較時的位置,和str2的起始位置,假設為s1 和 s2
在這里插入圖片描述

通過比較s1 和 s2 的元素,判斷是否相符合,如果不符合s1 回到 str1的位置, s2回到 str2 的位置
然后str1++找到下一個元素,從這個元素開始比較,當s2指向\0的時候,則返回str1的地址,我們也可以定義一個cur來存放str1的地址,這樣比較清晰一點

3.2 實現代碼

#include <stdio.h>
#include <string.h>
#include <assert.h>char* my_strstr(const char* str1, const char* str2)
{const char* cur = str1;  //用cur用來記錄當前的位置const char* s1 = NULL;   //通過s1 和 s2 比較元素const char* s2 = NULL;assert(str1 && str2);    //assert斷言,如果傳入的地址有有一個會空指針,則直接返回str1的地址if (str2 == '\0')return (char*)str1;while (*cur)   //當cur中的值不為'\0'時,進入循環{s1 = cur;   //s1回到比較時的位置s2 = str2;  //s2回到初始位置while (*s1 == *s2) //當s1和s2指向的值相等時,進入循環{s1++;  //找到下一個元素s2++;  //找到下一個元素//再次比較}if (*s2 == '\0')  //當s2中的元素為'\0'時,則說明在str1中找到了str2return (char*)cur; //返回當前的位置cur++; //第一次沒找到,找到下一個元素重新尋找}return NULL; //如果在循環中沒有找到,則返回一個空指針
}int main()
{char arr1[] = "abcadefdef";char arr2[] = "def";char* ret = my_strstr(arr1, arr2);if (ret != NULL){printf("%s\n", ret);}else{printf("找不到\n");}return 0;
}

運行結果如下:
在這里插入圖片描述

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

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

相關文章

怎樣自動把網頁截圖發到微信群里

現在很多公司都在使用企業微信了&#xff0c;不但方便公司內部交流和客戶交流&#xff0c;還能組建各種小組群&#xff0c;業務群。企業微信群提供一個機器人的功能&#xff0c;方便我們把公司業務信息&#xff0c;或來自外部的信息自動發布到群里。 這里研究一下如何向微信群…

大數據-之LibrA數據庫系統告警處理(ALM-37003 GTM主備不同步或者GTM主備斷連)

告警解釋 當GTM主實例與GTM備實例連接異常或者GTM主實例未處于同步狀態時&#xff0c;產生該告警。 告警屬性 告警ID 告警級別 可自動清除 37003 嚴重 是 告警參數 參數名稱 參數含義 ServiceName 產生告警的服務名稱 RoleName 產生告警的角色名稱 HostName 產…

基于OpenCV+MediaPipe的手勢識別

【精選】【優秀課設】基于OpenCVMediaPipe的手勢識別&#xff08;數字、石頭剪刀布等手勢識別&#xff09;_石頭剪刀布opencv識別代碼_網易獨家音樂人Mike Zhou的博客-CSDN博客 import cv2 import mediapipe as mp import mathdef vector_2d_angle(v1, v2):求解二維向量的角度v…

HIVE SQL 判斷空值函數

目錄 nvl()coalesce() nvl() select nvl(null,2);輸出&#xff1a;2 select nvl(,2);輸出&#xff1a;‘’ coalesce() select coalesce(null,2);輸出&#xff1a;2 select coalesce(,2);輸出&#xff1a;‘’ select coalesce(null,null,2);輸出&#xff1a;2 *coalesc…

Maxwell安裝部署消費到kafka集群

1.上傳安裝包到linux系統上面 2.解壓安裝包到安裝目錄下&#xff0c;并且重命名 [rootVM-4-10-centos package]# tar -zxvf maxwell-1.29.2.tar.gz -C /opt/software/3.配置mysql 增加以下配置 #數據庫id server-id 1 #啟動binlog&#xff0c;該參數的值會作為binlog的文件…

分布式鎖詳解

文章目錄 分布式鎖1. [傳統鎖回顧](https://blog.csdn.net/qq_45525848/article/details/134608044?csdn_share_tail%7B%22type%22:%22blog%22,%22rType%22:%22article%22,%22rId%22:%22134608044%22,%22source%22:%22qq_45525848%22%7D)1.1. 從減庫存聊起1.2. 環境準備1.3. 簡…

leetcode每日一題32

82.刪除排序鏈表中的重復元素 主要問題是沒有頭節點&#xff0c;以及要刪除所有的相等元素&#xff0c;不是留下一個 那么首先要建立一個頭節點&#xff0c;指向head 而且指針要始終指向要刪除的節點的前一個節點 ListNode* pre new ListNode(0,head);在搜索的過程中&#x…

Handler系列-Message是怎么重復利用的

1.Message類的支持 使用鏈表來緩存Message&#xff0c;sPool為表頭&#xff1b;最多能緩存50個Message&#xff1b;sPoolSync用來保證讀寫鏈表的安全&#xff1b; public final class Message implements Parcelable {private static Message sPool; //緩存的列表表頭/*packa…

98、Text2Room: Extracting Textured 3D Meshes from 2D Text-to-Image Models

簡介 github 利用預訓練的2D文本到圖像模型來合成來自不同姿勢的一系列圖像。為了將這些輸出提升為一致的3D場景表示&#xff0c;將單目深度估計與文本條件下的繪畫模型結合起來&#xff0c;提出了一個連續的對齊策略&#xff0c;迭代地融合場景幀與現有的幾何形狀&#xff0…

#Js篇:單線程模式同步任務異步任務任務隊列事件循環setTimeout() setInterval()

單線程模式 之所以采用單線程&#xff0c;而不是多線程&#xff0c;跟歷史有關系。原因是不想讓瀏覽器變得太復雜&#xff0c;因為多線程需要共享資源、且有可能修改彼此的運行結果&#xff0c;對于一種網頁腳本語言來說&#xff0c;太復雜了。 好處 實現起來比較簡單&#…

nginx國密ssl測試

文章目錄 文件準備編譯部署nginx申請國密數字證書配置證書并測試 文件準備 下載文件并上傳到服務器&#xff0c;這里使用centos 7.8 本文涉及的程序文件已打包可以直接下載。 點擊下載 下載國密版openssl https://www.gmssl.cn/gmssl/index.jsp 下載穩定版nginx http://n…

訪問者模式 (Visitor Pattern)

定義 訪問者模式&#xff08;Visitor Pattern&#xff09;是一種行為型設計模式&#xff0c;用于將算法與其作用于的對象結構分離。這種模式主要用于執行操作或應用過程&#xff0c;這些操作需要在不同類型的對象上執行&#xff0c;同時避免讓這些對象的類變得過于復雜。 關鍵…

【Python 訓練營】N_5 斐波那契數列

題目 輸出斐波那契數列 分析 斐波那契數列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又稱黃金分割數列&#xff0c;指的是這樣一個數列&#xff1a;0、1、1、2、3、5、8、13、21、34、……。 在數學上&#xff0c;費波那契數列是以遞歸的方法來定義&#xff…

9.9 Windows驅動開發:內核遠程線程實現DLL注入

在筆者上一篇文章《內核RIP劫持實現DLL注入》介紹了通過劫持RIP指針控制程序執行流實現插入DLL的目的&#xff0c;本章將繼續探索全新的注入方式&#xff0c;通過NtCreateThreadEx這個內核函數實現注入DLL的目的&#xff0c;需要注意的是該函數在微軟系統中未被導出使用時需要首…

用XMind2TestCase,測試更輕松

&#x1f4e2;專注于分享軟件測試干貨內容&#xff0c;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01;&#x1f4e2;交流討論&#xff1a;歡迎加入我們一起學習&#xff01;&#x1f4e2;資源分享&#xff1a;耗時200小時精選的「軟件測試」資…

C++ Qt QByteArray用法介紹

作者:令狐掌門 技術交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目錄 一、QByteArray的基本用法1、初始化和賦值2、訪問和修改元素3、 常用方法4、數據轉換二、QByteArray與文件操作三、QByteArray與網絡編程四、QByteArray數據編碼1、Base64 編解…

數據庫-MySQL之數據庫必知必會10-13章

第10章 創建計算字段 拼接字段 使用Concat()函數 執行算術計算 示例&#xff1a;從 Products 表中返回 prod_id、prod_price 和 sale_price。sale_price 是一個包含促銷價格的計算字段。提示&#xff1a;可以乘以 0.9&#xff0c;得到原價的 90%&#xff08;即 10%的折扣&…

2023.11.24 海豚調度,postgres庫使用

目錄 海豚調度架構dolphinscheduler DAG(Directed Acyclic Graph)&#xff0c; 個人自用啟動服務 DS的架構(海豚調度) 海豚調度架構dolphinscheduler 注:需要先開啟zookeeper服務,才能進行以下操作 通過UI進行工作流的配置操作, 配置完成后, 將其提交執行, 此時執行請求會被…

數組基礎知識

數組基礎&#xff08;不定時更新&#xff09; 數組基礎 數組基礎 &#xff08;1&#xff09;數組是存放在連續內存空間上的相同類型數據的集合。數組可以方便的通過下標索引的方式獲取到下標下對應的數據。數組下標都是從0開始的。數組內存空間的地址是連續的。 &#xff08;…

【科普知識】什么是步進電機?

德國百格拉公司于1973年發明了五相混合式步進電機及其驅動器&#xff0c;1993年又推出了性能更加優越的三相混合式步進電機。我國在80年代以前&#xff0c;一直是反應式步進電機占統治地位&#xff0c;混合式步進電機是80年代后期才開始發展。 步進電機是一種用電脈沖信號進行…