自己手寫一個字符串【C風格】

//字符串的常見操作
#include <iostream>#define MAX_SIZE 15
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;//狀態類型
typedef char ElemType;//元素類型typedef ElemType String[MAX_SIZE + 1];//第一個字節記錄長度//***tring是數組,名字就是地址位置,不用指針傳遞
// 
//創建
Status StrAssign(String T, const char* chars)
{int length = strlen(chars);if (length > MAX_SIZE)return ERROR;T[0] = (char)length;//第一個放保存字符的長度for (int i = 1; i <= length; i++){T[i] = chars[i - 1];}return OK;
}//復制 T <-- S
Status StrCopy(String T, String S)
{for (int i = 0; i <= S[0]; i++){T[i] = S[i];//把第一個長度的字符也復制}return OK;
}//判斷為空
Status StrEmpty(String T)
{return T[0] == 0 ? TRUE : FALSE;
}//比較大小 T>S:1;T==S:0,T<S:-1
int StrCompare(String T, String S)
{for (int i = 1; (i <= T[0]) && (i <= T[0]); i++){if (T[i] > S[i])return 1;else if (T[i] <  S[i])return -1;}//在雙方最小的字符段長度內相同,就看字符串的長度誰大if (T[0] > S[0])return 1;else if (T[0] < S[0])return -1;else if (T[0] == S[0])return 0;
}//返回長度
Status StrLength(String T)
{return (int)T[0];
}//清空
Status ClearString(String T)
{T[0] = 0;return OK;
}//連接字符串
Status Concat(String T, String S1, String S2)
{if (((int)S1[0] + (int)S2[0]) <= MAX_SIZE){T[0] = (char)((int)S1[0] + (int)S2[0]);for (int i = 1; i <= (int)S1[0]; i++)T[i] = S1[i];for (int j = 1; j <= (int)S2[0]; j++)T[ j + (int)S1[0] ] = S2[j];return OK;}//超過了長度for (int i = 1; i <= (int)S1[0]; i++)T[i] = S1[i];for (int j = 1; j <= MAX_SIZE; j++)//第二個太長截斷T[j + (int)S1[0]] = S2[j];T[0] = MAX_SIZE;return ERROR;
}//取子字符串
Status SubString(String Sub, String T, int pos, int len)
{//len不能超過剩余的字符串長度if ((len < 1) || (pos > (int)T[0]) || (pos < 1) || len > (int)T[0] - pos + 1)return ERROR;for (int i = 1; i <= len; i++){Sub[i] = T[pos + i - 1];}Sub[0] = (char)len;return OK;
}//在T里面查找S,從pos的位置開始查找,返回查找到的位置
int Index(String T, String S, int pos)
{if ((S[0] == 0) || (T[0] == 0) || (S[0] > T[0]) || (pos < 0) ||(pos > T[0]))return -1;int i = pos;int j = 1;while (i<=T[0] && j <= S[0]){if (T[i] == S[j]){j++;i++;}else{i = i - j + 2;//回退到下一位置j = 1;}}if (j > (int)S[0])return i - (int)S[0];return -1;
}//在T里面查找S,從pos的位置開始查找,返回查找到的位置
int Index2(String T, String S, int pos)
{if ((S[0] == 0) || (T[0] == 0) || (S[0] > T[0]) || (pos < 0) || (pos > T[0]))return -1;int n = StrLength(T);int m = StrLength(S);String sub;int i = 1;while (i <= n - m + 1){SubString(sub, T, i, m);if (StrCompare(sub, S) == 0)return i;i++;}return -1;
}//插入,S 插入到T的pos位置
Status StrInsert(String T, int pos, String S)
{if (pos<1 || pos > S[0] + 1)return ERROR;//只能部分插入情況if (((int)S[0] + (int)T[0]) > MAX_SIZE){//擴張原本的字符串大小,只能擴張到最大for (int i = (int)T[0]; i >= pos; i--){T[MAX_SIZE+ i- (int)T[0]] = T[ i ];}//再從pos的位置插入,插入剩余的空余位置for (int i = 1; i <= MAX_SIZE - (int)T[0]; i++){T[pos + i - 1] = S[i];}T[0] = MAX_SIZE;return ERROR;}//完全插入//擴張原本的字符串大小,并空出位置for (int i = (int)T[0]; i >= pos; i--){T[ i +(int)S[0] ]= T[i];}//再從pos的位置插入for (int i = 1; i <= (int)S[0]; i++){T[pos + i - 1] = S[i];}T[0] =(char)((int)T[0] + (int)S[0]);return OK;
}
//指定位置刪除若干字符
Status StrDelete(String T, int pos, int len)
{if ((pos<1) || (pos > T[0] + 1) || (len > T[0] - pos + 1) || (pos < 0))return ERROR;for (int i = pos + len; i <= T[0]; i++)//從后面往前面覆蓋刪除的位置數據{T[i - len] = T[i];}T[0] = (char)((int)T[0] - len);return OK;
}//在T里面把S替換成V
Status Replace(String T, String S, String V)
{if (StrEmpty(S))return ERROR;int i = 1;while ( i > 0){i = Index(T, S, i);if ( i> 0 ){StrDelete(T, i, StrLength(S));StrInsert(T, i, V);i += StrLength(V);}}return OK;
}//顯示
Status ShowString(String T)
{if (StrLength(T) == 0)return ERROR;for (int i = 1; i <= StrLength(T); i++){printf("%c", T[i]);}printf("\n\n");return OK;
}int main()
{String str, strcopy, strcat;StrAssign(str, "abcd");printf("長度:%d, 是否為空:%d(1:是 0:否)\n\n", StrLength(str),StrEmpty(str));printf("顯示str:\n");ShowString(str);StrCopy(strcopy, str);printf("復制str顯示strcopy:\n");ShowString(strcopy);StrAssign(strcopy, "efghijk");printf("重新顯示strcopy:\n");ShowString(strcopy);printf("比較str和strcopy是否相等:%d(0:相等)\n\n", StrCompare(str, strcopy));printf("str拼接strcopy:\n");Concat(strcat, str, strcopy);ShowString(strcat);ClearString(str);printf("清空重新顯示str:\n");ShowString(str);printf("長度:%d, 是否為空:%d(1:是 0:否)\n\n", StrLength(str), StrEmpty(str));SubString(str, strcat, 2, 3);printf("截取后重新顯示str:\n");ShowString(str);printf("長度:%d, 是否為空:%d(1:是 0:否)\n\n", StrLength(str), StrEmpty(str));StrDelete(str, 1, 2);printf("刪除重新顯示str:\n");ShowString(str);printf("長度:%d, 是否為空:%d(1:是 0:否)\n\n", StrLength(str), StrEmpty(str));StrInsert(str, 2, strcopy);printf("插入重新顯示str:\n");ShowString(str);printf("長度:%d, 是否為空:%d(1:是 0:否)\n\n", StrLength(str), StrEmpty(str));int ind = Index(str, strcopy, 1);printf("查找到了,位置為:%d\n",ind);printf("strcat:\n");ShowString(strcat);printf("strcopy:\n");ShowString(strcopy);printf("str:\n");ShowString(str);Replace(strcat, str, strcopy);printf("替換重新顯示strcat:\n");ShowString(strcat);printf("長度:%d, 是否為空:%d(1:是 0:否)\n\n", StrLength(strcat), StrEmpty(strcat));printf("strcat插入一個更長的數:\n");String s;StrAssign(s, "123456");StrInsert(strcat, 5, s);//原本的串保留,新插入的截斷printf("strcat:\n");ShowString(strcat);printf("長度:%d, 是否為空:%d(1:是 0:否)\n\n", StrLength(strcat), StrEmpty(strcat));ClearString(str);ClearString(strcopy);ClearString(strcat);printf("strcat:\n");ShowString(strcat);printf("strcopy:\n");ShowString(strcopy);printf("str:\n");ShowString(str);return 0;
}

在這里插入圖片描述

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

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

相關文章

c#自動生成缺陷圖像-添加新功能(可從xml直接提取目標數據,然后進行數據離線增強)--20240524

在進行深度學習時,數據集十分重要,尤其是負樣本數據。 故設計該軟件進行深度學習數據預處理,最大可能性獲取較多的模擬工業現場負樣本數據集。 該軟件基于VS2015、.NETFrameWork4.7.2、OpenCvSharp1.0.0.0、netstandard2.0.0.0、SunnyUI3.2.9.0、SunnyUI.Common3.2.9.0及Ope…

C盤磁盤空間不夠用,怎樣將d盤的空間劃分給c盤?

C盤磁盤空間不夠用&#xff0c;怎樣將d盤的空間劃分給c盤&#xff1f; 背景&#xff1a;win10系統下。C盤原有50G&#xff0c;如今只剩下8G&#xff0c;已經捉襟見肘了&#xff0c;想從D盤&#xff0c;割100G給C盤&#xff0c;以后軟件能直接裝C盤了。操作步驟如下&#xff1a…

2024年人文藝術與創新教育國際學術會議(ICHAIE 2024)

2024年人文藝術與創新教育國際學術會議&#xff08;ICHAIE 2024) 2024 International Conference on Humanities, Arts and Innovation Education 一、【會議簡介】 隨著全球化的推進和科技的迅猛發展&#xff0c;人文藝術與創新教育在培養未來人才方面扮演著越來越重要的角色…

溫故而知新-導航【面試復習】

溫故而知新-導航【面試復習】 前言版權溫故而知新-導航【面試復習】最后 前言 2024-5-18 00:01:31 以下內容源自《【溫故而知新】【面試復習】》 僅供學習交流使用 版權 禁止其他平臺發布時刪除以下此話 本文首次發布于CSDN平臺 作者是CSDN日星月云 博客主頁是https://jsss…

【深度學習】ONNX介紹

ONNX&#xff08;Open Neural Network Exchange&#xff09; ONNX 是一種用于表示深度學習模型的開放格式&#xff0c;使得不同深度學習框架&#xff08;如 PyTorch、TensorFlow、Caffe2 等&#xff09;之間的模型能夠相互交換。 需安裝&#xff1a; pip install --upgrade o…

docker 版 mysql 主從同步

docker 版 mysql 主從同步 1、環境2、搭建主服務器實例33062.1、命令2.3、進入/mydata/mysql-master/conf 目錄下新建 my.cnf2.4、修改完配置后重啟 master 實例2.5、進入 mysql-master 容器2.6、master 容器實例內創建數據同步用戶3、新建從服務實例 33083.1、命令3.2、進入/m…

springboot185基于vue.js的客戶關系管理系統(crm)的設計與實現-手把手調試搭建

springboot185基于vue.js的客戶關系管理系統(crm)的設計與實現-手把手調試搭建 springboot185基于vue.js的客戶關系管理系統(crm)的設計與實現-手把手調試搭建

springboot事務結合分布式鎖超賣問題

背景 商品銷售扣減庫存是常見的場景&#xff0c;考慮性能的可以使用redis存儲庫存進行扣減&#xff0c;并發小的也可以采用數據量庫存占用記錄實時計算方式&#xff0c;最近開發的功能由于并發量不大&#xff0c;考慮到實現簡潔的因素&#xff0c;決定采用庫存占用記錄實時計算…

后端之路第二站(正片)——SprintBoot之:設置請求接口

這一篇講怎么簡單結合模擬云接口&#xff0c;嘗試簡單的后端接接口、接受并傳數據 一、下載Apifox接口文檔軟件 目前的企業都是采用前后端分離開發的&#xff0c;在開發階段前后端需要統一發送請求的接口&#xff0c;前端也需要在等待后端把數據存到數據庫之前&#xff0c;自己…

初始MyBatis ,詳細步驟運行第一個MyBatis程序,同時對應步驟MyBatis底層剖析

1. 初始MyBatis &#xff0c;詳細步驟運行第一個MyBatis程序&#xff0c;同時對應步驟MyBatis底層剖析 文章目錄 1. 初始MyBatis &#xff0c;詳細步驟運行第一個MyBatis程序&#xff0c;同時對應步驟MyBatis底層剖析每博一文案2. 前沿知識2.1 框架&#xff08;framework&#…

剪畫小程序:3個方法:告訴你如何將普通的照片轉換成動漫二次元風格!

Hello&#xff01;親愛的小伙伴們&#xff01; 你是否還在糾結于自己的自拍太普通&#xff0c;每次分享到社交賬號上都覺得平平無奇&#xff0c;引不起波瀾&#xff1f; 假如&#xff0c;你和朋友們一起出去玩&#xff0c;大家都開心地拍著自拍。你看著自己的照片&#xff0c…

藍橋杯-數三角(ac代碼時間復雜度分析)

問題描述 小明在二維坐標系中放置了 ( n ) 個點&#xff0c;他想在其中選出一個包含三個點的子集&#xff0c;這三個點能組成三角形。然而這樣的方案太多了&#xff0c;他決定只選擇那些可以組成等腰三角形的方案。請幫他計算出一共有多少種選法可以組成等腰三角形&#xff1f…

WXML模板語法-事件綁定

一、 1.事件 事件是渲染層到邏輯層的通訊方式&#xff0c;通過事件可以將用戶在渲染層產生的行為&#xff0c;反饋到邏輯層進行業務的處理 2.小程序中常用的事件 3.事件對象的屬性列表 當事件回調觸發的時候&#xff0c;會收到一個事件對象event&#xff0c;其屬性為&#x…

在uni-app 插件市場下載 SKU 插件之后,引入項目報錯問題

引入&#xff1a; git 提交報錯&#xff1a; 原因&#xff1a;項目使用了 eslint 語法檢查 解決&#xff1a;禁用 eslint 語法規則 在<script> 標簽下面添加 /* eslint-disable */ 重新提交即可

Winform 界面管理

winform 打開多個界面時&#xff0c;如果使用 Form.Show 方法&#xff0c;有時候沒注意就把同一個窗體打開多次&#xff0c;這可能會導致數據混亂&#xff0c;如果去判斷窗體是否打開也很麻煩&#xff0c;需要寫一堆的代碼才能實現&#xff0c;為了解決這個問題&#xff0c;我做…

【網絡技術】【Kali Linux】Wireshark嗅探(十四)QUIC(快速UDP互聯網連接)協議報文捕獲及分析

往期 Kali Linux 上的 Wireshark 嗅探實驗見博客&#xff1a; 【網絡技術】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【網絡技術】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 協議 【網絡技術】【Kali Linux】Wireshark嗅探&…

【Python快速上手(三十一)】- Python MongoDB 詳解

目錄 Python快速上手&#xff08;三十一&#xff09;Python MongoDB 詳解1. 安裝 pymongo2. 連接 MongoDB3. 創建和刪除集合4. CRUD 操作5. 查詢操作6. 索引7. 聚合8. 其他操作9. 連接池和超時10. 實際應用案例 Python快速上手&#xff08;三十一&#xff09; Python MongoDB …

移動硬盤容量消失無法讀取的解決方案

在數字化時代&#xff0c;數據的存儲和備份變得尤為重要。移動硬盤作為一種便捷、大容量的存儲設備&#xff0c;受到許多人的青睞。然而&#xff0c;有時我們可能會遭遇這樣的問題&#xff1a;移動硬盤不顯示容量且無法訪問。這種情況無疑給我們的數據存儲和管理帶來了巨大的困…

uniapp移動端骨架屏流程

1.使用微信開發者工具來生成骨架屏&#xff1b;在分窗模式下選擇頁面信息&#xff0c;下拉選擇生成骨架屏&#xff1b;他會基于當前頁面生成骨架屏的樣式 點擊確定&#xff1b; 會自動生成這兩個文件&#xff1b;一個是html結構文件&#xff0c;一個是css樣式文件。 然后把這兩…

黃石首家Pearson VUE國際認證考試中心落戶湖北理工學院

Pearson VUE 作為 Pearson 集團的專門從事計算機化考試服務的公司&#xff0c;到目前為止&#xff0c;已在全世界165 個國家授權了 4400 多個考試中心以及超過 230 家 PVUE 自有考試中心&#xff0c;其中在中國的有三百多個授權考點和 4 個自有考試中心。Pearson VUE 以其技術和…