字符串
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
#define MaxSize 100
/*静态串的定义*/
typedef struct{
/*串的最大长度+ 一个'\0',并且从下标1开始存储*/
char cha[MaxSize+2];
/*记录串的长度*/
int length;
}Str_static;
/*动态串的定义*/
typedef struct{
char *ch;//串
int length;//记录串的长度
} Str_dynamic;
/**
* 将字符串ch赋值给串str :从1开始
* @param str
* @param ch
* @return
*/
bool strAssign(Str_dynamic *str, char *ch){
/*释放原串空间*/
if(str != NULL){
free(str->ch);
/*防止重复释放*/
str->ch=NULL;
}
/*记录串的长度*/
int len=-1;
/*统计字符串长度*/
while(ch[++len] != '\0');
/*空串*/
if(len==0){
str->ch=NULL;
str->length=0;
return 0;
}
//申请存储串的空间 +2是因为要存 入'\0',并且下标1开始是有效内容
str->ch=(char *)malloc(sizeof (char) *(len+2));
if(str->ch==NULL){
printf("申请空间失败");
return false;
}
/*将字符串复制到串中*/
for (int i = 1; i <=len+1; ++i) {
str->ch[i]=ch[i-1];
}
/*记录串的长度*/
str->length=len;
return true;
}
/**
* 获取串的长度
* @param str
* @return
*/
int getStrLength(Str_dynamic str){
return str.length;
}
/**
* 比较两个串的大小
* @param s1
* @param s2
* @return
*/
int strCompare(Str_dynamic s1,Str_dynamic s2){
/*同步遍历,直到其中一个或者两个串遍历借宿*/
for (int i = 1; i <=s1.length && i<=s2.length; ++i) {
/*某个位置上 两者的ASCII不相等,ASCII码大的字符串大*/
if(s1.ch[i]!=s2.ch[i]){
return s1.ch[i]-s2.ch[i];
}
}
/*如果遍历结束,说明两者相等,返回长度差*/
return s1.length-s2.length;
}
/**
* 将两个串连接起来
* @param Str
* @param str1
* @param str2
* @return
*/
bool strConcat(Str_dynamic Str,Str_dynamic str1,Str_dynamic str2){
/*释放Str 的空间*/
if(Str.ch != NULL){
free(Str.ch);
/*防止重复释放*/
Str.ch=NULL;
}
/*申请空间 ;+2是因为要存 入'\0',并且下标1开始是有效内容*/
Str.ch=(char *)malloc(sizeof (char) *(str1.length+str2.length+2));
if(Str.ch==NULL){
/*申请空间失败*/
return false;
}
/*从1开始 是有效内容*/
int i =1;
while(i<=str1.length){
Str.ch[i]=str1.ch[i];
i++;
}
while(i<=str1.length+str2.length){
Str.ch[i]=str2.ch[i-str1.length];
i++;
}
/*设置长度*/
Str.length=str1.length+str2.length;
return true;
}
/**
* 获取子串
* @param Str_out
* @param str_in
* @param pos
* @param len
* @return
*/
bool getSubStr(Str_dynamic *Str_out,Str_dynamic str_in,int pos,int len){
if(pos<1 || pos >str_in.length || len<0 || len>str_in.length-pos+1){
/*非法参数*/
return false;
}
/*释放 str_out的空间*/
if(Str_out->ch != NULL){
free(Str_out->ch);
Str_out->ch=NULL;
}
if(len ==0){
/*直接输出空的字符串*/
Str_out->ch=NULL;
Str_out->length=0;
return true;
}
/* 输出的字符串:申请空间 +2是因为要存 入'\0',并且下标1开始是有效内容*/
Str_out->ch=(char *)malloc(sizeof (char) *(len+2));
if(Str_out->ch==NULL){
/*申请空间失败*/
return false;
}
/*从1开始 是有效内容*/
int i=pos, j=1;
while(i<=pos+len){
Str_out->ch[j]=str_in.ch[i];
i++;
j++;
}
Str_out->ch[j]=0;
/*设置长度*/
Str_out->length=len;
return true;
}
bool clearStr(Str_dynamic *str){
if(str->ch != NULL){
/*释放串空间*/
free(str->ch);
/*防止重复释放*/
str->ch=NULL;
}
/*设置长度为0*/
str->length=0;
return true;
}
int main() {
//初始化动态串 :长度为2
Str_dynamic s;
s.ch=(char *)malloc(sizeof (char) *(2));
s.length=2;
printf("Hello, World!\n");
return 0;
}