概述
串的常見操作:
- 賦值操作:將一個字符數組(即串)中的所有元素複製到另一個字符數組中。
- 取串長操作:在使用變長分配存儲表示的情況下,直接返回str.length即可。
- 串比較操作:設兩個串A和B中的待比較字符分別爲a和b,如果a的ASCII碼小於b的ASCII碼,則返回A小於B的標記;如果a的ASCII碼大於b的ASCII碼,則返回A大於B的標記;如果a的ASCII碼等於b的ASCII碼,則按照之前的規則比較兩串中的下一對字符。經過上述步驟,在沒有比較出A和B大小的情況下,先結束的串爲較小的串,兩串同時結束則返回兩串相等標記。
- 串連接操作:將兩個串首尾相連,合併成一個字符串。
- 求子串操作:求從給定串中某一位置開始到某一位置結束的串。
- 串清空操作:清空串。
代碼
核心代碼:
/* 賦值操作 */
/* &str指的是新字符串;*ch指的是原字符串 */
int strAssign(Str &str,char *ch) {
if(str.ch) {// 如果原字符串有內容
free(str.ch);// 則釋放原串空間
}
int len=0;
char *c=ch;// 求ch串的長度
while(*c) {
len++;
c++;
}
if(len==0) { // 如果ch爲空串,則直接返回空串
str.ch=NULL;
str.length=0;
return 1;
} else {
str.ch=(char *)malloc(sizeof(char)*(len+1));// 取len+1是爲了多分配一個空間存放"\0"字符
if(str.ch==NULL) {
return 0;
} else {
c=ch;
for(int i=0; i<=len; i++,c++) { // 注意:循環條件中之所以使用"<="是爲了將ch最後的"\0"複製到新串中作爲結束標記
str.ch[i]=*c;
}
str.length=len;
return 1;
}
}
}
/* 求字符串長度 */
int strLength(Str str) {
return str.length;// 返回字符串的長度
}
/* 字符串的比較,返回0表示相等,返回>0表示大於,返回<0表示小於 */
/* s1指的是要參與比較的字符串1;s2的是要參與比較的字符串2 */
int strCompare(Str s1,Str s2) {
for(int i=0; i<s1.length&&i<s2.length; i++) {
if(s1.ch[i]!=s2.ch[i]) {
return s1.ch[i]-s2.ch[i];
}
}
return s1.length-s2.length;
}
/* 連接字符串 */
/* &str指的是連接成功後的新字符串;str1指的是原字符串1;str2指的是原字符串2 */
int concat(Str &str,Str str1,Str str2) {
if(str.ch) {
free(str.ch);// 釋放原串空間
str.ch=NULL;
}
str.ch=(char *)malloc(sizeof(char)*(str1.length+str2.length+1));
if(str.ch==NULL) {
return 0;
}
int i=0;
while(i<str1.length) {
str.ch[i]=str1.ch[i];
i++;
}
int j=0;
while(j<=str2.length) {
str.ch[i+j]=str2.ch[j];
j++;
}
str.length=str1.length+str2.length;
return 1;
}
/* 求子串 */
/* &substr指的是結果子串;str指的是原字符串;pos指的是起始位置下標;len指的是要取子串的長度 */
int subString(Str &substr,Str str,int pos,int len) {
if(pos<0||pos>=str.length||len<0||len>str.length-pos) {
return 0;
}
if(len==0) {
substr.ch=NULL;
substr.length=0;
return 1;
} else {
substr.ch=(char *)malloc(sizeof(char)*(len+1));
int i=pos;
int j=0;
while(i<pos+len) {
substr.ch[j]=str.ch[i];
i++;
j++;
}
substr.ch[j]='\0';
substr.length=len;
return 1;
}
}
/* 串清空 */
int clearString(Str &str) {
if(str.ch) {
free(str.ch);
str.ch=NULL;
}
str.length=0;
return 1;
}
完整代碼:
#include<stdio.h>
#include<stdlib.h>
#define maxSize 20
typedef struct {
char *ch;
int length;
} Str;
/* 打印字符串 */
void printStr(Str str) {
printf("\n");
for(int i=0; i<str.length; i++) {
printf("%c",str.ch[i]);
}
printf("\n");
}
/* 賦值操作 */
/* &str指的是新字符串;*ch指的是原字符串 */
int strAssign(Str &str,char *ch) {
if(str.ch) {// 如果原字符串有內容
free(str.ch);// 則釋放原串空間
}
int len=0;
char *c=ch;// 求ch串的長度
while(*c) {
len++;
c++;
}
if(len==0) { // 如果ch爲空串,則直接返回空串
str.ch=NULL;
str.length=0;
return 1;
} else {
str.ch=(char *)malloc(sizeof(char)*(len+1));// 取len+1是爲了多分配一個空間存放"\0"字符
if(str.ch==NULL) {
return 0;
} else {
c=ch;
for(int i=0; i<=len; i++,c++) { // 注意:循環條件中之所以使用"<="是爲了將ch最後的"\0"複製到新串中作爲結束標記
str.ch[i]=*c;
}
str.length=len;
return 1;
}
}
}
/* 求字符串長度 */
int strLength(Str str) {
return str.length;// 返回字符串的長度
}
/* 字符串的比較,返回0表示相等,返回>0表示大於,返回<0表示小於 */
/* s1指的是要參與比較的字符串1;s2的是要參與比較的字符串2 */
int strCompare(Str s1,Str s2) {
for(int i=0; i<s1.length&&i<s2.length; i++) {
if(s1.ch[i]!=s2.ch[i]) {
return s1.ch[i]-s2.ch[i];
}
}
return s1.length-s2.length;
}
/* 連接字符串 */
/* &str指的是連接成功後的新字符串;str1指的是原字符串1;str2指的是原字符串2 */
int concat(Str &str,Str str1,Str str2) {
if(str.ch) {
free(str.ch);// 釋放原串空間
str.ch=NULL;
}
str.ch=(char *)malloc(sizeof(char)*(str1.length+str2.length+1));
if(str.ch==NULL) {
return 0;
}
int i=0;
while(i<str1.length) {
str.ch[i]=str1.ch[i];
i++;
}
int j=0;
while(j<=str2.length) {
str.ch[i+j]=str2.ch[j];
j++;
}
str.length=str1.length+str2.length;
return 1;
}
/* 求子串 */
/* &substr指的是結果子串;str指的是原字符串;pos指的是起始位置下標;len指的是要取子串的長度 */
int subString(Str &substr,Str str,int pos,int len) {
if(pos<0||pos>=str.length||len<0||len>str.length-pos) {
return 0;
}
if(len==0) {
substr.ch=NULL;
substr.length=0;
return 1;
} else {
substr.ch=(char *)malloc(sizeof(char)*(len+1));
int i=pos;
int j=0;
while(i<pos+len) {
substr.ch[j]=str.ch[i];
i++;
j++;
}
substr.ch[j]='\0';
substr.length=len;
return 1;
}
}
/* 串清空 */
int clearString(Str &str) {
if(str.ch) {
free(str.ch);
str.ch=NULL;
}
str.length=0;
return 1;
}
int main() {
Str str;
strAssign(str,"abcd efgh");
printStr(str);
Str str2,str3;
str2.length=2;
str2.ch="ab";
str3.length=3;
str3.ch="abc";
int r=strCompare(str2,str3);
printf("%d",r);
Str str4;
concat(str4,str2,str3);
printStr(str4);
Str str5;
int i=subString(str5,str,2,2);
printStr(str5);
return 0;
}
運行結果: