數據結構 - C/C++ - 串

字符處理

C

  • 特性

    • C語言中字符串存儲在字符數組中,以空字符'\0'結束。

    • 字符串常量,const char* str = "Hello",存儲在只讀的數據段中。

  • 布局

    • 字符串在內存中是字符連續存儲的集合,最后一個字符為空字符(ASCII值為0),用來標識當前字符串的結束。

    • 字符串可以存儲在棧(局部變量)、堆(動態分配)、全局、靜態區等。

  • 處理

    • C標準庫提供的字符串處理函數,<string.h>頭文件中,包含了字符串拷貝、拼接、比較、長度、截斷等。

CPP

  • 特性

    • C++提供了std::string類型,它封裝了字符數組,并且在此基礎上提供了更加豐富的字符串處理業務。

    • std::string支持內存動態擴容,不需要指定緩沖區大小。

  • 布局

    • std::string內部管理與維護一個動態分配內存大小的指針,用于存儲字符串數據。
  • 處理

    • std::string是標準模板庫(STL)中的一部分,其實現定義在頭文件<string.h>中。

串的概念

  • 串基本概念

    • 串(字符串)是由零個或多個字符組成的有限序列。

  • 串和線程表

    • 線性表指的是元素之間的線性關系,元素之間的物理結構是次要的。

    • 串是特殊的線性表,串當中的元素為字符,串整體與字串的關系。

  • 串存儲結構

    • 順序結構

      • 順序結構基于一段連續的內存空間來存儲串當中的字符序列。
    • 鏈式結構

      • 鏈式結構基于鏈表的形式存儲字符串,每個節點可以包含一個或多個字符。
    • 塊鏈結構

      • 塊鏈結構基于串的分割,每一塊包含一個字符數組,不同的塊通過鏈表關聯。
        ?

串的操作

#include <iostream>namespace str
{// length       字符串長度// str          源字符串int length(const char* str){// 參數校驗if (str == NULL) return -1;// 獲取長度int nLength = 0;while (*(str++) != '\0') nLength++;// 返回結果return nLength;}// Assign       字符串賦值// Dest         目標字符串的緩沖區// Sour         源字符串// DestSize     目標緩沖區的大小void Assign(char* Dest, const char* Sour, size_t DestSize){// 參數校驗if (Dest == NULL || Sour == NULL || DestSize == 0) return;// 內容賦值int nLength = 0;while (*Sour/*源字符串當前下標字符是否為空*/ && nLength < DestSize - 1/*目標緩沖區長度是否滿足*/){//Dest[nLength] = Sour[nLength];*Dest++ = *Sour++;nLength++;}*Dest = '\0';}// Concatenate  字符串拼接// str1         第一個字符串的緩沖區// str2         連接的字符串緩沖區// str1Size     第一個字符串的緩沖區長度void Concatenate(char* str1, const char* str2, size_t str1Size){//參數校驗if (str1 == NULL || str2 == NULL || str1Size == 0) return;//字符長度int str1length = str::length(str1);//字符拼接int i = 0;for (i = 0; str2[i] != '\0' && str1Size - 1 > str1length + i; i++){str1[str1length + i] = str2[i];}//追加標記str1[str1length + i] = '\0';}// SunString    子串提取// Sour         源字符串數據// Dest         提取字符串空間// nDestSize    提取字符串容量 // nStart       提取字符串位置// nCount       提取字符串數量void SubString(const char* Sour, char* Dest, int nDestSize, int nStart, int nCount){//參數校驗if (Sour == NULL || Dest == NULL || nDestSize == 0 || nCount == 0) return;//起始校驗int nSourLength = str::length(Sour);if (nSourLength <= nStart || nStart < 0) return;//長度校驗if (nCount < 0 || nCount > nSourLength - nStart) return;//空間校驗if (nCount >= nDestSize) return;//提取子串int i = 0;for (i = 0; i < nCount; i++){Dest[i] = Sour[nStart + i];}//字符追加Dest[i] = '\0';}// SubPosition  子串查找// Sour         源字符串// Sub          子串內容int SubPosition(const char* Sour, const char* Sub){//參數校驗if (Sour == NULL || Sub == NULL) return -1;//數據備份int nPosition = 0;const char* str_it;const char* sub_it;//算法定位for (str_it = Sour; *str_it != '\0'; str_it++){sub_it = Sub;//數據匹配if (*str_it == *sub_it){const char* str_temp = str_it;//匹配子串while (*str_temp && *sub_it && (*str_temp == *sub_it)){str_temp++, sub_it++;}if (*sub_it == '\0'){return nPosition;}}nPosition++;}return -1;}// Compare      字符串比較// str1         源字符串// str2         目標字符串int Compare(const char* str1, const char* str2){//參數校驗if (str1 == NULL || str2 == NULL) return -1;//字符比較while (*str1 && *str2){if (*str1 == *str2){str1++;str2++;}else{break;}}return *str1 - *str2;}// Insert       字符串插入// str1         源字符串數據// str2         被插入字符串數據// nPos         插入位置索引// size_str1    源字符串緩沖區總大小void Insert(char* str1, const char* str2, int nPos, int size_str1){//參數校驗if (str1 == NULL || str2 == NULL) return;//字符長度int str1len = str::length(str1);int str2len = str::length(str2);//下標越界if (nPos < 0 || nPos > str1len) return;//空間處理if (str1len + str2len + 1 > size_str1) return;//移動空間for (int i = str1len; i >= nPos; i--){str1[i + str2len] = str1[i];}//數據拷貝for (int i = 0; i < str2len; i++){str1[nPos + i] = str2[i];}}// Delete       字符串刪除// str          源字符串數據// nPos         起始刪除位置// nlength      刪除字符長度void Delete(char* str, int nPos, int nlength){//參數校驗if (str == NULL) return;//起始校驗int strlen = str::length(str);if (nPos < 0 || nPos > strlen) return;//刪除校驗if (nlength < 0 || (nPos + nlength) > strlen) return;//位置修正char* Start = str + nPos;char* End = str + nPos + nlength;//數據刪除while (*End){*Start++ = *End++;}*Start = '\0';}// Replace      字符串替換// str          源字符串數據// to_replace   被替換字符串// repalce      替換字符串// size_str     緩沖區長度void Replace(char* str, const char* to_replace, const char* repalce, int size_str){//參數校驗if (str == NULL || to_replace == NULL || repalce == NULL) return;//子串定位int nPos = str::SubPosition(str, to_replace);if (nPos == -1)return;//空間判斷int strlen = str::length(str);int torlen = str::length(to_replace);int replen = str::length(repalce);if (strlen - torlen + replen > size_str) return;//拷貝數據char* pTemp = (char*)malloc(size_str);if (pTemp == NULL)return;memset(pTemp, 0, size_str);//00 00 00 00 00 00 00 00 00 00 00 00 00memcpy(pTemp, str, nPos);//H E L 00 00 00 00 00 00 00 00 00 00memcpy(pTemp + nPos, repalce, replen);//H E L 0 x C C 00 00 00 00 00 00memcpy(pTemp + nPos + replen, str + nPos + torlen, strlen - torlen - nPos);//H E L 0 x C C H E L L O 0memcpy(str, pTemp, size_str);free(pTemp);}// Split        字符串分割// str          源字符串數據// chDelimiter  分隔符// outCount     子串數量char** Split(const char* str, char chDelimiter, int* outCount){//參數校驗if (str == NULL) return NULL;//分割數量int nCount_Delimiter = 1;for (int i = 0; str[i] != '\0'; i++){if (str[i] == chDelimiter) ++nCount_Delimiter;}//寫回數據*outCount = nCount_Delimiter;//分配空間char** strArr = (char**)malloc(nCount_Delimiter * sizeof(char*));if (!strArr) return NULL;memset(strArr, 0, nCount_Delimiter * sizeof(char*));//子串長度int i = 0;int j = 0;int nCount_Word = 0;for (i = 0, nCount_Word = 0; str[i] != '\0'; i++){if (str[i] != chDelimiter){nCount_Word++;}else{strArr[j++] = (char*)malloc(nCount_Word * sizeof(char) + 1);nCount_Word = 0;}       }strArr[j] = (char*)malloc(nCount_Word * sizeof(char) + 1);//拷貝數據for (i = 0, j = 0, nCount_Word = 0; str[i]; i++){if (str[i] != chDelimiter){strArr[j][nCount_Word++] = str[i];}else{strArr[j][nCount_Word++] = '\0';j++;nCount_Word = 0;}}strArr[j][nCount_Word++] = '\0';return strArr;}}int main()
{//字符長度const char szBuffer1[50] = "0xCC";int nLength = str::length(szBuffer1);//字符賦值char szBuffer2[4] = { 0 };str::Assign(szBuffer2, "Hello", sizeof(szBuffer2));//字符拼接char szBuffer3[50] = "Hello";str::Concatenate(szBuffer3, "World", sizeof(szBuffer3));//子串提取char szBuffer4[] = "Hello World";char szBuffer5[10] = { 0 };str::SubString(szBuffer4, szBuffer5, sizeof(szBuffer5), 6, 5);//子串查找char szBuffer8[] = "HELHELLHELLO";char szBuffer9[] = "HELLO";str::SubPosition(szBuffer8, szBuffer9);//字符比較char szBuffer6[] = "Hel";char szBuffer7[] = "Hel";str::Compare(szBuffer6, szBuffer7);//字符插入char szBuffer10[12] = "Hello";char szBuffer11[] = "0xCC";str::Insert(szBuffer10, szBuffer11, 1, sizeof(szBuffer10));//字符刪除str::Delete(szBuffer10, 1, 4);//字符替換char szBuffer12[] = "HELHELLHELLO";char szBuffer13[] = "HELL";char szBuffer14[] = "CC";   str::Replace(szBuffer12, szBuffer13, szBuffer14, sizeof(szBuffer12));//字符分割int nCount = 0;char szBuffer15[] = "Hello,World,Ferry,0xCC";char** resule = str::Split(szBuffer15, ',', &nCount);return 0;
}

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

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

相關文章

opencascade AIS_InteractiveContext源碼學習7 debug visualization

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允許您在一個或多個視圖器中管理交互對象的圖形行為和選擇。類方法使這一操作非常透明。需要記住的是&#xff0c;對于已經被交互上下文識別的交互對象&#xff0c;必須使用上下文方法進行…

【問題已解決】Vue管理后臺,點擊登錄按鈕,會發起兩次網絡請求(竟然是vscode Compile Hero編譯插件導致的)

問題 VueElement UI 做的管理后臺&#xff0c;點擊登錄按鈕&#xff0c;發現 接口會連續掉兩次&#xff0c;發起兩次網絡請求&#xff0c;但其他接口都是正常調用的&#xff0c;沒有這個問題&#xff0c;并且登錄按鈕也加了loading&#xff0c;防止重復點擊&#xff0c;于是開…

搜索引擎常用語法

引號 (" "): 用雙引號將詞組括起來&#xff0c;搜索引擎將返回包含完全相同短語的結果。 示例&#xff1a;"人工智能發展趨勢" 減號 (-): 在關鍵詞前加上減號可以排除包含特定詞語的結果。 示例&#xff1a;人工智能 -機器學習&#xff08;排除包含 “機器…

樸素貝葉斯解密:sklearn中的分類器工作原理

&#x1f4da; 樸素貝葉斯解密&#xff1a;sklearn中的分類器工作原理 在機器學習領域&#xff0c;樸素貝葉斯分類器因其簡單、高效而廣受歡迎。特別是在處理大量特征數據時&#xff0c;樸素貝葉斯表現出了卓越的性能。scikit-learn&#xff08;簡稱sklearn&#xff09;是Pyth…

JavaMySQL 學習(基礎)

目錄 Java CMD Java發展 計算機存儲規則 Java學習 switch新用法&#xff08;可以當做if來使用&#xff09; 數組定義 隨機數 Java內存分配 MySQL MySQL概述 啟動和停止 客戶端連接 數據模型 關系型數據庫 SQL SQL通用語法 SQL分類 DDL--數據定義語言 數據庫…

瀏覽器開發者工具輔助爬蟲開發

文章目錄 瀏覽器開發者工具輔助爬蟲開發打開開發者工具使用Network面板分析請求數據示例步驟&#xff1a; 使用Elements面板查看和修改DOM結構示例步驟&#xff1a; 使用Console面板調試JavaScript代碼示例步驟&#xff1a;示例代碼&#xff1a;1. 輸出日志信息2. 輸出對象信息…

Vue 與 React 區別

Vue.js和React是現代Web開發中兩種非常流行的前端框架&#xff0c;兩者在**核心概念、組件以及生態系統擴展性**等方面存在區別。具體分析如下&#xff1a; 1. **核心概念** - **Vue**&#xff1a;Vue是一個漸進式JavaScript框架&#xff0c;它致力于視圖層&#xff0c;易于上手…

左值右值, 左值引用右值引用,完美轉發

一. 左值和右值 左值: 可以取地址的對象 右值: 不可以取地址的對象 double x1.0, y 2.0; 1; // 字面量, 不可取地址, 是右值 x y; // 表達式返回值, 不可取地址, 是右值 max(x, y); // 傳值返回函數的返回值 (非引用返回)總結就是: 根據是否可以取地址來區分是左值還…

線程池666666

1. 作用 線程池內部維護了多個工作線程&#xff0c;每個工作線程都會去任務隊列中拿取任務并執行&#xff0c;當執行完一個任務后不是馬上銷毀&#xff0c;而是繼續保留執行其它任務。顯然&#xff0c;線程池提高了多線程的復用率&#xff0c;減少了創建和銷毀線程的時間。 2…

git修改已提交的commit注釋

在Git中修改已經提交的commit注釋通常有以下幾種情況和相應的方法&#xff1a; 1. 修改最后一次提交的注釋&#xff08;快速修正&#xff09; 如果你想要修改的是最后一次提交的注釋&#xff0c;可以使用 --amend 選項&#xff1a; git commit --amend這個命令會將你的暫存區…

基于深度學習的光度檢測

基于深度學習的光度檢測&#xff08;Photometric Detection&#xff09;涉及從圖像中檢測和分析光照信息&#xff0c;用于多種應用&#xff0c;如場景理解、照明調節、增強現實&#xff08;AR&#xff09;、圖像增強等。以下是關于這一領域的系統介紹&#xff1a; 1. 任務和目…

JAVA基礎教程DAY1-類與方法及形參實參

首先經過C語言的學習&#xff0c;我們已經學會了基本的編程方法&#xff0c;我們知道C語言是面向過程的編程語言&#xff0c;而JAVA是面向對象的編程語言&#xff0c;所以接下來我們通過對比和舉例來進行JAVA語言的學習 首先我們來講類的概念 類&#xff1a;類是一個模板&…

Ubuntu開通5005端口 記錄

Ubuntu版本&#xff1a;20.04 使用systemctl status firewalld查看防火墻狀態&#xff0c;報錯Unit firewalld.service could not be found 報錯的原因是沒有安裝firewall&#xff0c;安裝命令為sudo apt install firewalld&#xff0c;然后進行安裝 安裝完成后輸入systemctl…

vscode jupyter選擇Python環境時找不到我安裝的Python

在一些情況下&#xff0c;我們需要自己安裝一個Python&#xff0c;在選擇內核是可能找不到指定的Python版本&#xff0c; 再次打開內核選擇頁面就能看到Python環境了 注意先到指定環境下安裝依賴包&#xff1a; ./python3 pip install ipykernel notebook jupyter

人工智能-NLP簡單知識匯總01

人工智能-NLP簡單知識匯總01 1.1自然語言處理的基本概念 自然語言處理難點&#xff1a; 語音歧義句子切分歧義詞義歧義結構歧義代指歧義省略歧義語用歧義 總而言之&#xff1a;&#xff01;&#xff01;語言無處不歧義 1.2自然語言處理的基本范式 1.2.1基于規則的方法 通…

[DataWhale大模型應用開發]學習筆記1-嘗試搭建向量數據庫

1.詞向量 1.定義 詞向量&#xff08;Word Vector&#xff09;是將單詞表示為向量形式的技術&#xff0c;是自然語言處理&#xff08;NLP&#xff09;中的一種常用方法。通過將單詞轉化為向量&#xff0c;計算機能夠更好地理解和處理語言。簡單來說&#xff0c;詞向量就是將單…

Windows系統安裝NVM,實現Node.js多版本管理

目錄 一、前言 二、NVM簡介 三、準備工作 1、卸載Node 2、創建文件夾 四、下載NVM 五、安裝NVM 六、使用NVM 1、NVM常用操作命令 2、查看NVM版本信息 3、查看Node.js版本列表&#xff1b; 4、下載指定版本Node.js 5、使用指定版本Node.js 6、查看已安裝Node.js列…

深度學習賦能數據分析,聯蔚盤云引領業務革新

一、引言 隨著大數據時代的到來&#xff0c;深度學習技術正逐漸成為企業數據分析的新引擎。聯蔚盤云憑借其在深度學習領域的深厚積累&#xff0c;為企業提供高效、精準的數據分析解決方案&#xff0c;助力企業實現業務革新與增長。 二、深度學習與數據分析的完美結合 聯蔚盤…

【區塊鏈+基礎設施】國家健康醫療大數據科創平臺 | FISCO BCOS應用案例

在醫療領域&#xff0c;疾病數據合法合規共享是亟待解決的難題。一方面&#xff0c;當一家醫院對患者實施治療后&#xff0c;若患者轉到其 他醫院就醫&#xff0c;該醫院就無法判斷診療手段是否有效。另一方面&#xff0c;醫療數據屬于個人敏感數據&#xff0c;一旦被泄露或被惡…

一個能讓渲染性能提高100倍的辦法

GPU 光線追蹤是當今的熱門話題&#xff0c;所以讓我們來談談它&#xff01;今天我們將光線追蹤一個單個球體。 使用片段著色器。 是的&#xff0c;我知道。并不特別花哨。你可以在 Shadertoy 上搜索并獲得數百個示例(https://www.shadertoy.com/results?querysphere)。甚至已…