概述
串的常见操作:
- 赋值操作:将一个字符数组(即串)中的所有元素复制到另一个字符数组中。
- 取串长操作:在使用变长分配存储表示的情况下,直接返回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;
}
运行结果: