// 在這裏預先定義,'/0'作爲串結束的標誌
#include<iostream>
#include<stdio.h>
#include<string.h>
char* str = new char[100];
// 線性表傳入參數需要引用,線性表指針被包裝,所以修改值需要引用
// 字符串操作可以直接傳指針
void StrAssign(char* S,char* T)
{
// strlen()位於<string.h>裏,用於char*字符數組求長度;
// str.length()位於<string>裏,用於string字符串求長度;
// 兩個函數無法交叉使用
int length = strlen(T);
int cnt=0;
while(cnt < length)
{
S[cnt] = T[cnt];
++cnt;
}
//對於普通串最好進行操作以後在串尾加'\0',這樣保證後面操作程序運行的正確
S[cnt] = '\0';
return;
}
void StrCopy(char* T,char* S)
{
int cnt = 0;
while(cnt < strlen(S))
{
T[cnt] = S[cnt];
++cnt;
}
T[cnt] = '\0';
return ;
}
// 返回字符串長度
int StrLength(char *S)
{
return strlen(S);
}
// 是否爲空串
bool StrEmpty(char* S)
{
if(strlen(S) != 0)
return false;
return true;
}
// 返回字符串長度,c++自帶求字符數組長度的函數
//int StrLength(char *S){}
// 連接兩個字符串,並且不改變這兩個串的值
char* Concat(char* S1,char* S2)
{
char* s = new char[strlen(S1)+strlen(S2)+1];
int cnt = 0,cas=0;
while(S1[cnt])
{
s[cas++] = S1[cnt++];
}
cnt = 0;
while(S2[cnt])
{
s[cas++] = S2[cnt++];
}
s[cas] = '\0';
return s;
}
// 將串清空
void ClearStr(char* S)
{
// 調用字符串求長度函數時'\0'也是作爲串結束的標誌
// 後面的操作可以對串進行覆蓋
S[0] = '\0';
return ;
}
// 比較兩個串的大小
int Compare(char* S1,char* S2)
{
int cnt = 0;
while(S1[cnt]&&S2[cnt])
{
// 使用if-else-if減少判斷次數
if(S1[cnt] > S2[cnt])
return 1;
else if(S1[cnt] < S2[cnt])
return -1;
++cnt;
}
if(S1[cnt])return 1;
else if(S2[cnt])return -1;
return 0;
}
// 截取定位的子串
char* SubString(char* S,int pos,int len)
{
char* sub = new char[len+1];
int length = strlen(S);
if(pos > length)
{
// 直接return '\0'在程序外操作發生錯誤
// !先賦值在返回
sub[0] = '\0';
}
else
{
int cnt = 0,cas = pos;
// 設定從pos截取len超過串長度,將前面有效部分截取
while((cas < (pos+len)) && S[pos])
{
sub[cnt++] = S[cas++];
}
sub[cnt] = '\0';
}
return sub;
}
// 返回第一次出現相同子串的定位pos值
int Index(char* S1,char* S2,int pos)
{
// cas定位S2串中座標,len表示配對的子串長度
int cas = 0,len = 0;
int len1=strlen(S1),len2=strlen(S2);
while(pos < len1)
{
while(cas < len2)
{
// 當存在相同字符進入循環,長度在循環中增加
while(S1[pos+len] == S2[cas+len])
{
++len;
}
// 長度不爲0跳出循環
if(len != 0) break;
// 未進入循環,S2座標右移
++cas;
}
if(len !=0) break;
// 當前pos下標未找到適配字符,S1右移;
// cas置零
++pos,cas=0;
}
if(len == 0)return 0;
else return pos;
}
// 從定位pos起插入字符串
// 注意後尾長度出現覆蓋問題,pos後移會產生覆蓋問題
char* StrInsert(char* S,char *T,int pos)
{
int len_t = strlen(T);
int len_s = strlen(S);
char* str_s_t =new char[len_t+len_s+10];
int cnt = 0,cas = 0;
while(cnt < pos )
{
str_s_t[cas++] = S[cnt++];
}
cnt = 0;
while(cnt < len_t)
{
str_s_t[cas++] = T[cnt++];
}
while(S[pos])
{
str_s_t[cas++] = S[pos++];
}
str_s_t[cas] = '\0';
return str_s_t;
}
// 從定位pos開始刪除子串
void StrDelete(char* S,int pos,int len)
{
int len_s = strlen(S);
if((pos+len) > len_s)
{
S[pos]= '\0';
}
else
{
int cnt = pos,cas = pos + len;
while(S[cas])
{
S[pos++] = S[cas++];
}
S[pos] = '\0';
}
}
// 銷燬串,自帶函數不需要定義
void DestroyString(char* S){ delete[] S; }// new和delete作爲關鍵字不是函數不需要加()
int main()
{
char* t = new char[100];// 長度在使用過程中可以變換,初值可以隨意設置;
StrAssign(str,"abcdefg");
int i=0;printf(" ");while(str[i])printf("%c",str[i++]);printf("\n");
StrCopy(t,str);
i = 0;printf(" ");while(t[i]){printf("%c",t[i++]);}printf("\n");
char* str_t = Concat(str,"dcba");
i = 0;printf(" ");while(str_t[i]){printf("%c",str_t[i++]);}printf("\n");
if(Compare(str,t) == 0)
{
printf(" ");
printf("輸入兩個字符串相等!\n");
}
char* subStr = SubString(str,100,3);
char* subStr1 = SubString(str,2,3);
char* subStr2 = SubString(str,2,100);
i=0;printf(" ");while(subStr[i]){printf("%c",subStr[i++]);}printf("\n");
i=0;printf(" ");while(subStr1[i]){printf("%c",subStr1[i++]);}printf("\n");
i=0;printf(" ");while(subStr2[i]){printf("%c",subStr2[i++]);}printf("\n");
printf(" ");printf("%d\n",Index("abcde","fghij",3));
printf(" ");printf("%d\n",Index("abcde","fgcdehij",0));
printf(" ");printf("%d\n",Index("abcde","fgcdehij",3));
char* str1 = new char[100];
StrAssign(str1,"abcglmnabcdefghijklmn");
char* str2 = new char[100];
StrAssign(str2,"def");
char* str3=StrInsert(str1,str2,3);
i=0;printf(" ");while(str3[i]){printf("%c",str3[i++]);}printf("\n");
StrDelete(str3,5,20);
i=0;printf(" ");while(str3[i]){printf("%c",str3[i++]);}printf("\n");
StrDelete(str3,1,1);
i=0;printf(" ");while(str3[i]){printf("%c",str3[i++]);}printf("\n");
ClearStr(str_t);
if(StrEmpty(str_t))
{
printf(" ");
printf("輸入爲空串!\n");
}
delete[] str;
delete[] str1;
delete[] str2;
delete[] str3;
delete[] subStr;
delete[] subStr1;
delete[] subStr2;
delete[] t;
delete[] str_t;
return 0;
}
字符數組_串的實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.