深入探索C語言中的字符串處理函數:strstr與strtok

在C語言的字符串處理領域,?strstr?和?strtok?是兩個非常重要的函數,它們各自承擔著獨特的功能,為開發者處理字符串提供了強大的支持。

?一、strstr函數:字符串查找的利器

?

?strstr?函數用于在一個字符串中查找另一個字符串的首次出現位置。其函數原型如下:

char *strstr(const char *haystack, const char *needle);

?

- ?haystack?是被查找的主字符串,就像在干草堆里找針,這個干草堆就是?haystack?。

?

- ?needle?是要查找的子字符串,即那根“針”。

?

1. 基本使用示例

#include <stdio.h>

#include <string.h>

int main() {

? ? const char *haystack = "Hello, world! This is a test string.";

? ? const char *needle = "world";

? ? char *result = strstr(haystack, needle);

? ? if (result) {

? ? ? ? printf("找到了子字符串,位置是: %ld\n", result - haystack);

? ? } else {

? ? ? ? printf("未找到子字符串\n");

? ? }

? ? return 0;

}

在這個例子中,我們在?haystack?字符串中查找?needle?子字符串。如果找到,?strstr?會返回一個指向?needle?在?haystack?中首次出現位置的指針,通過計算這個指針與?haystack?起始地址的差值,我們就能得到子字符串的位置。

2. 原理剖析

?strstr?函數通常采用樸素的字符串匹配算法。它從?haystack?的第一個字符開始,依次與?needle?的第一個字符進行比較。如果匹配,就繼續比較后續字符;如果不匹配,?haystack?的比較位置就向后移動一位,重新開始比較。這種算法的時間復雜度在最壞情況下為O(m * n),其中m是?haystack?的長度,n是?needle?的長度。雖然有更高效的字符串匹配算法,如KMP算法,但?strstr?的實現相對簡單,在大多數情況下也能滿足需求。

?

3. 注意事項

- ?strstr?函數對大小寫敏感。如果需要進行不區分大小寫的查找,需要自己實現額外的邏輯,比如將兩個字符串都轉換為大寫或小寫后再進行比較。

?

- 當?needle?為空字符串時,?strstr?會返回?haystack?本身,因為空字符串被認為在任何字符串的開頭都存在。

?

二、strtok函數:字符串分割的能手

?

?strtok?函數用于將字符串按照指定的分隔符進行分割。其函數原型如下:

char *strtok(char *str, const char *delim);

- ?str?是要分割的字符串。

?

- ?delim?是包含分隔符的字符串。

?

1. 基本使用示例

#include <stdio.h>

#include <string.h>

int main() {

? ? char str[] = "apple,banana;cherry:date";

? ? const char *delim = ",;:";

? ? char *token = strtok(str, delim);

? ? while (token!= NULL) {

? ? ? ? printf("Token: %s\n", token);

? ? ? ? token = strtok(NULL, delim);

? ? }

? ? return 0;

}

在這個例子中,我們使用?strtok?函數將?str?字符串按照?,?, ?;?和?:?進行分割。第一次調用?strtok?時,傳入要分割的字符串?str?和分隔符?delim?,之后每次調用?strtok?時,第一個參數傳入?NULL?,表示繼續從上一次分割結束的位置開始分割。

?

2. 原理剖析

?strtok?函數內部維護了一個靜態變量來記錄上一次分割的位置。當第一次調用時,它會在?str?中查找第一個出現的分隔符,將分隔符替換為?'\0'?,并返回指向分割出的第一個子字符串的指針。后續調用傳入?NULL?時,它會從上次記錄的位置繼續查找下一個分隔符,重復上述操作。這種方式使得?strtok?能夠方便地對字符串進行逐段分割,但也意味著它不適合多線程環境,因為靜態變量會被多個線程共享,導致數據競爭。

?

3. 注意事項

- ?strtok?會修改被分割的字符串,將分隔符替換為?'\0'?。如果需要保留原始字符串,應該先進行復制。

- 由于內部使用靜態變量,在多線程環境下使用?strtok?需要特別小心,可以考慮使用線程安全的替代函數,如?strtok_r?(在POSIX系統中可用)。

?

三、總結

?strstr?和?strtok?是C語言字符串處理的重要工具。?strstr?專注于字符串查找,讓我們能快速定位子字符串的位置;?strtok?則擅長字符串分割,幫助我們將復雜的字符串拆分成有意義的片段。深入理解它們的工作原理、使用方法和注意事項,能夠讓我們在處理字符串相關任務時更加得心應手,編寫出高效、健壯的代碼。無論是開發小型程序還是大型項目,這兩個函數都可能在關鍵環節發揮重要作用。

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

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

相關文章

AIGC(生成式AI)試用 21 -- Python調用deepseek API

1. 安裝openai pip3 install openai########################## Collecting openaiUsing cached openai-1.61.1-py3-none-any.whl.metadata (27 kB) Collecting anyio<5,>3.5.0 (from openai)Using cached anyio-4.8.0-py3-none-any.whl.metadata (4.6 kB) Collecting d…

關于使用雪花算法生成唯一ID,返回給前端ID不一致的問題

問題 在某個項目中,使用雪花算法生成的唯一ID,從數據庫查詢到數據后返回給前端,但是前端接受到的數據ID和數據庫原先生成的不一致 但是前端展示的數據: 原因 原因是后端使用Long類型來存儲雪花算法生成的ID,但是這個數值已經超過前端數值類型的范圍,導致前端在存儲這個數值…

Windows 啟動 SSH 服務

Windows 啟動 SSH 服務 一、OpenSSH Server 安裝 以 Win10 系統為例 打開設置 -> 系統 -> 可選功能 在 添加的功能 查看是否安裝了 OpenSSH 服務 或者 OpenSSH Server 如果沒有安裝&#xff0c;找到 系統->添加可選功能 -> 查看功能->搜索 OpenSSH 服務 ->…

C#功能測試

List 內部元素為引用 src[0]為"11" List<Source> src new List<Source>(); src.Add(new Source() { Name "1", Age 1, Description "1" }); src.Add(new Source() { Name "2", Age 2, Description "2"…

大數據SQL調優專題——Flink執行原理

引入 上一篇我們了解了Spark&#xff0c;相比起MapReduce來說&#xff0c;它確實已經快了超級多了&#xff0c;但是人類的欲望是沒有止境的&#xff0c;這也是推動人類進步的動力。 Flink就是為了滿足實時響應的場景需求誕生的。 其實在Flink之前&#xff0c;實時處理其實已…

計算機視覺:神經網絡實戰之手勢識別(附代碼)

第一章&#xff1a;計算機視覺中圖像的基礎認知 第二章&#xff1a;計算機視覺&#xff1a;卷積神經網絡(CNN)基本概念(一) 第三章&#xff1a;計算機視覺&#xff1a;卷積神經網絡(CNN)基本概念(二) 第四章&#xff1a;搭建一個經典的LeNet5神經網絡(附代碼) 第五章&#xff1…

win11安裝wsl報錯:無法解析服務器的名稱或地址(啟用wsl2)

1. 啟用wsl報錯如下 # 查看可安裝的 wsl --install wsl --list --online此原因是因為沒有開啟DNS的原因&#xff0c;所以需要我們手動開啟DNS。 2. 按照如下配置即可 Google的DNS&#xff08;8.8.8.8和8.8.4.4) 全國通用DNS地址 (114.114.114.114) 3. 運行以下命令來重啟 WSL…

開源模型應用落地-DeepSeek-R1-Distill-Qwen-7B-LoRA微調-LLaMA-Factory-單機單卡-V100(一)

一、前言 如今&#xff0c;大語言模型領域熱鬧非凡&#xff0c;各種模型不斷涌現。DeepSeek-R1-Distill-Qwen-7B 模型憑借其出色的效果和性能&#xff0c;吸引了眾多開發者的目光。而 LLaMa-Factory 作為強大的微調工具&#xff0c;能讓模型更好地滿足個性化需求。 在本篇中&am…

k8s-對接NFS存儲

一、前提條件 1、NFS_Server 部署好了。 2、網絡可達。 二、 使用方式 1、CSI **項目地址 https://github.com/kubernetes-csi/csi-driver-nfs#readme Install NFS CSI driver v4.10.0 version on a kubernetes cluster If you have already installed Helm, you can a…

【動態路由】系統Web URL資源整合系列(后端技術實現)【nodejs實現】

需求說明 軟件功能需求&#xff1a;反向代理功能&#xff08;描述&#xff1a;apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 業務應用等多個web資…

Git 修改或刪除某次提交信息

Git 修改或刪除某次提交信息 情況一&#xff1a;未推送到遠程倉庫修改提交信息刪除提交信息&#xff08;替換為空信息&#xff09;修改歷史提交信息刪除歷史提交信息 情況二&#xff1a;已推送到遠程倉庫修改最新提交信息并推送到遠程倉庫修改歷史提交信息并推送到遠程倉庫 情況…

DeepSeek崛起:如何在云端快速部署你的專屬AI助手

在2025年春節的科技盛宴上&#xff0c;DeepSeek因其在AI領域的卓越表現成為焦點&#xff0c;其開源的推理模型DeepSeek-R1擅長處理多種復雜任務&#xff0c;支持多語言處理&#xff0c;并通過搜索引擎獲取實時信息。DeepSeek因其先進的自然語言處理技術、廣泛的知識庫和高性價比…

DeepSeek部署到本地(解決ollama模型下載失敗問題)

一、下載ollama軟件安裝 1、下載ollama軟件 Ollama 下載完成后可以直接進行安裝&#xff08;外網&#xff0c;速度可能會有點慢&#xff09; 2、修改安裝目錄 進去下載的目錄&#xff0c;使用cmd打開終端輸入OllamaSetup.exe /DIRE:\MySoftware\Ollama 輸入完成后會自動打開…

GPT1 大模型

GPT1 大模型 模型架構訓練過程 GPT-1 : 采用傳統的語言模型方法進行預訓練&#xff0c;擅長處理自然語言生成任務&#xff08;NLG&#xff09;OpenAI 在 2018 年 6 月推出 1.17 億個參數的 GPT-1 (Generative Pre-training , 生成式預訓練) 數據集 : 數據來源 : BooksCorpus…

?1.HTML、CSS 和 JavaScript 是什么?

?? HTML、CSS 和 JavaScript 是構建網頁的三大核心技術&#xff0c;它們相互協作&#xff0c;讓網頁呈現出豐富的內容、精美的樣式和交互功能。以下為你詳細介紹&#xff1a; &#x1f98b;1. HTML&#xff08;超文本標記語言&#xff09; 定義&#xff1a;HTML 是一種用于描…

x86平臺基于Qt+opengl優化ffmpeg軟解碼1080P視頻渲染效率

一般的在arm嵌入式平臺&#xff0c;大多數板子都要硬解碼硬件渲染的框架&#xff0c;使用即可。 在x86下比較麻煩了。 優化的思路一共有以下幾個方面&#xff0c; 1. 軟解碼變成硬解碼 2. 將YUV轉QImage的操作轉移到GPU 3. QWidget渲染QImage變成opengGL渲染AVFrame 這三點…

ocr智能票據識別系統|自動化票據識別集成方案

在企業日常運營中&#xff0c;對大量票據實現數字化管理是一項耗時且容易出錯的任務。隨著技術的進步&#xff0c;OCR&#xff08;光學字符識別&#xff09;智能票據識別系統的出現為企業提供了一個高效、準確的解決方案&#xff0c;不僅簡化了財務流程&#xff0c;還大幅提升了…

docker批量pull/save/load/tag/push鏡像shell腳本

目錄 注意&#xff1a; 腳本內容 執行效果 注意&#xff1a; 以下腳本為shell腳本通過docker/nerdctl進行鏡像獨立打包鏡像的相關操作腳本內倉庫信息和鏡像存取路徑需自行更改需自行創建images.txt并填寫值&#xff0c;并且與腳本位于同級目錄下 [rootmaster01 sulibao]# l…

利用Java爬蟲精準獲取商品銷量詳情:實戰案例指南

在電商領域&#xff0c;商品銷量數據是衡量產品受歡迎程度和市場表現的關鍵指標。精準獲取商品銷量詳情不僅能幫助商家優化產品策略&#xff0c;還能為市場研究和數據分析提供豐富的數據資源。本文將詳細介紹如何利用Java爬蟲技術精準獲取商品銷量詳情&#xff0c;并分享關鍵技…

30 款 Windows 和 Mac 下的復制粘貼軟件對比

在日常電腦操作中&#xff0c;復制粘貼是極為高頻的操作&#xff0c;一款好用的復制粘貼軟件能極大提升工作效率。以下為你詳細介紹 30 款 Windows 和 Mac 下的復制粘貼軟件&#xff0c;并對比它們的優缺點&#xff0c;同時附上官網下載地址&#xff0c;方便大家獲取軟件。 Pa…