1. 程式人生 > >字串常用操作的實現

字串常用操作的實現

// myString.cpp 串採用定長順序儲存結構的基本操作(14個)
// SString是陣列,故不需引用型別。
// 串的定長順序儲存表示
#include <iostream>
#define MAXSTRLEN 40 // 使用者可在255以內定義最大串長(1個位元組)
typedef char SString[MAXSTRLEN+1]; // 0號單元存放串的長度
using namespace std;
bool  StrAssign(SString T,char *chars)
{ // 生成一個其值等於chars的串T
int i;
if(strlen(chars)>MAXSTRLEN)
return false;
else
{
T[0]=strlen(chars);
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
return true;
}
}


bool StrCopy(SString T,SString S)
{ // 由串S複製得串T
int i;
for(i=0;i<=S[0];i++)
T[i]=S[i];
return true;
}


bool StrEmpty(SString S)
{ // 若S為空串,則返回TRUE,否則返回FALSE
if(S[0]==0)
return true;
else
return false;
}


int StrCompare(SString S,SString T)
{ // 初始條件: 串S和T存在
// 操作結果: 若S>T,則返回值>0;若S=T,則返回值=0;
//若S<T,則返回值<0
int i;
for(i=1;i<=S[0]&&i<=T[0];++i)
if(S[i]!=T[i])
return S[i]-T[i];
return S[0]-T[0];
}


int StrLength(SString S)
{ // 返回串的元素個數
return S[0];
}


bool  ClearString(SString S)
{ // 初始條件:串S存在。操作結果:將S清為空串
S[0]=0;// 令串長為零
return true;
}


bool Concat(SString T,SString S1,SString S2) 
{ // 用T返回S1和S2聯接而成的新串。若未截斷,則返回TRUE,否則FALSE
int i;
if(S1[0]+S2[0]<=MAXSTRLEN)
{ // 未截斷
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(i=1;i<=S2[0];i++)
T[S1[0]+i]=S2[i];
T[0]=S1[0]+S2[0];
return true;
}
else
{ // 截斷S2
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(i=1;i<=MAXSTRLEN-S1[0];i++)
T[S1[0]+i]=S2[i];
T[0]=MAXSTRLEN;
return false;
}
}


bool SubString(SString Sub,SString S,int pos,int len)
{ // 用Sub返回串S的第pos個字元起長度為len的子串。演算法4.3
int i;
if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)
return false;
for(i=1;i<=len;i++)
Sub[i]=S[pos+i-1];
Sub[0]=len;
return true;
}


int Index(SString S,SString T,int pos)
{ // 返回子串T在主串S中第pos個字元之後的位置。若不存在,則函式值為0。
// 其中,T非空,1≤pos≤StrLength(S)。演算法4.5
int i,j;
if(1<=pos&&pos<=S[0])
{
i=pos;
j=1;
while(i<=S[0]&&j<=T[0])
if(S[i]==T[j]) // 繼續比較後繼字元
{
++i;
++j;
}
else // 指標後退重新開始匹配
{
i=i-j+2;
j=1;
}
if(j>T[0])
return i-T[0];
else
return 0;
}
else
return 0;
}


bool StrInsert(SString S,int pos,SString T)
{ // 初始條件: 串S和T存在,1≤pos≤StrLength(S)+1
// 操作結果: 在串S的第pos個字元之前插入串T。完全插入返回TRUE,部分插入返回FALSE
int i;
if(pos<1||pos>S[0]+1)
return false;
if(S[0]+T[0]<=MAXSTRLEN)
{ // 完全插入
for(i=S[0];i>=pos;i--)
S[i+T[0]]=S[i];
for(i=pos;i<pos+T[0];i++)
S[i]=T[i-pos+1];
S[0]=S[0]+T[0];
return true;
}
else
{ // 部分插入
for(i=MAXSTRLEN;i<=pos;i--)
S[i]=S[i-T[0]];
for(i=pos;i<pos+T[0];i++)
S[i]=T[i-pos+1];
S[0]=MAXSTRLEN;
return false;
}
}


bool StrDelete(SString S,int pos,int len)
{ // 初始條件: 串S存在,1≤pos≤StrLength(S)-len+1
// 操作結果: 從串S中刪除第pos個字元起長度為len的子串
int i;
if(pos<1||pos>S[0]-len+1||len<0)
return true;
for(i=pos+len;i<=S[0];i++)
S[i-len]=S[i];
S[0]-=len;
return false;
}


bool Replace(SString S,SString T,SString V)
{ // 初始條件: 串S,T和V存在,T是非空串(此函式與串的儲存結構無關)
// 操作結果: 用V替換主串S中出現的所有與T相等的不重疊的子串
int i=1; // 從串S的第一個字元起查詢串T
if(StrEmpty(T)) // T是空串
return false;
do
{
i=Index(S,T,i); // 結果i為從上一個i之後找到的子串T的位置
if(i) // 串S中存在串T
{
StrDelete(S,i,StrLength(T)); // 刪除該串T
StrInsert(S,i,V); // 在原串T的位置插入串V
i+=StrLength(V); // 在插入的串V後面繼續查詢串T
}
}while(i);
return true;
}


void DestroyString()
{ // 由於SString是定長型別,無法銷燬
}


void StrPrint(SString T)
{ // 輸出字串T。另加
int i;
for(i=1;i<=T[0];i++)
printf("%c",T[i]);
printf("\n");
}

相關推薦

字串常用操作實現

// myString.cpp 串採用定長順序儲存結構的基本操作(14個) // SString是陣列,故不需引用型別。 // 串的定長順序儲存表示 #include <iostream> #define MAXSTRLEN 40 // 使用者可在255以內定義

數組常用操作實現

數組反轉 body 反轉 平均值 class sum post ret length /** * 求數組中的最大值 * * @param a */ public double maxElement(double a

1 數據結構(13)_二叉樹的概念及常用操作實現

做什麽 != 後繼 switch 繼承 mem bad 葉子 static 1. 樹到二叉樹的轉換 思考:通用樹結構的實現太過復雜(樹中每個結點都可以有任意多的孩子,具有多種形態),工程中很少會用到如此復雜的樹是否可以簡化呢?思路:減少樹結點中孩子的數量。但這樣樹是否還能通

Java字串常用操作

String字串 查詢單引號裡的內容 // String regex = "'([^']*)'"; // 使用懶惰量詞 *? String regex = "'(.*?)'"; Pattern pattern = Pattern.compile(regex); Matcher matche

python3-字串常用操作

1 >>> name = "my name is LiSi" 2 # 首字母大寫 capitalize() 3 >>> name.capitalize() 4 'My name is lisi' 5 6 # 字串全部大寫 upper() 7

Python中字串常用操作

字串常用操作 (1)find 檢測指定字串是否包含在當前字串中,如果是返回開始的索引值,否則返回-1 strs.find(str,start,end) start 為起始位置,end為結束位置 (2)index 作用和find()方法一樣,不過當要查詢的字串不存在時

oracle字串常用操作

oracle操作字串:拼接、替換、擷取、查詢、長度、判斷 1、拼接字串 1)可以使用“||”來拼接字串 select '拼接'||'字串' as str from dual 2)通過concat()函式實現 select co

一文教你學會python讀取文字及字串常用操作

python 讀取txt檔案 開啟支付寶首頁搜尋‘543701491’,領取馬雲的支付寶紅包 Python的文字處理是經常碰到的一個問題,Python的txt檔案讀取中,有三類方法:read()、readline()、readlines(),這三種方法各有利弊,下面逐一介紹其使用方法和利

Python 之字串常用操作

字串表示:str與repr的區別str()函式把值轉換為合理形式的字串,便於理解repr()函式是建立一個字串,以合法的Python表示式形式來表示值。如下: #-*-encoding:utf-8-*- print repr("hello repr") print str("hello str")

Js字串常用操作總結

String型別 String型別是字串的物件包裝型別,可以使用String建構函式來建立 var stringObject = new String("hello world"); 1.字元方法 charAt():以單字元字串的形式返回給定位置

go語言中字串常用操作

導語 在工作中遇到了go語言,個人趕腳入門還是很快的,作為一個新手,這裡記錄自己遇到go語言中字串的用法。 基本知識簡介 型別為string 字串用 “” ,或者 ” 括起來定義 字串不可變 例如下面的例子會報錯: var s st

java字串常用操作(查詢、擷取、分割)

public class 字串常用操作 { public static void main(String[] args) { /* * 查詢子串

(四)Python學習之字串常用操作(下)

(四)Python學習之字串常用操作(下) 七.其他常用操作 1.format(*args,**kwargs): 格式化字串,將一個字串中的佔位符替換為指定的值;format 函式可以接受不限個引數,位置可以不按順序; print("網站名:{name}, 地址 {url}".for

(三)Python學習之字串常用操作(上)

(三)Python學習之字串常用操作(上) 一、字母處理 upper(): 全部大寫; lower(): 全部小寫; swapcase(): 大小寫互換; capitalize(): 首字母大寫,其餘小寫; title(): 首字母大寫(轉換為標題);

shell指令碼中字串常用操作整理

shell中常用字串操作整理 shell指令碼中常用字串操作如下: 1. 字串的比較 2. 字串的長度 3. 擷取字串 4. 字串的替換 下面分別講解這些操作的用法。 1. 字串的比較 1.1. 等於和不等於 user=zabbix # 這是最常用的 if [

shell變數字串常用操作小結

1、常用的基本操作解析: ①${#string} //返回$string的長度(字串中的字元個數),${string} | wc -m也可以達到類似的效果 ②${string:position} //返回$string的position開始的字串(提取字串

Java 字串常用操作(String類)

字串查詢 indexOf(String s) 該方法用於返回引數字串s在指定字串中首次出現的索引位置,當呼叫字串的indexOf()方法時,會從當前字串的開始位置搜尋s的位置;如果沒有檢索到字串s,該方法返回-1 String str ="

字串常用操作

字元型別:   一.包括:         C:字元         N:應該算是字元型的數字         D:日期型別,標準長度8(YYYYMMDD),注意其初期值的判斷,不是space,而是'00000000',判斷語句可以使用is initial or not。

javascript中字串常用操作總結、JS字串操作大全

字串的操作在js中非常頻繁,也非常重要。以往看完書之後都能記得非常清楚,但稍微隔一段時間不用,便會忘得差不多,記性不好是硬傷啊。。。今天就對字串的一些常用操作做個整理,一者加深印象,二者方便今後溫習查閱。 String物件屬性 (1) length屬性 length

Mysql常用功能操作實現

對查詢結果根據欄位首字按照字母順序排列 select  name from mnuser order by convert(name USING gbk) COLLATE   gbk_chinese_ci asc; 恢復資料表主鍵從0自增 alter table mn