ヒープ割り当てストレージ構造文字列の実装方法は、十分な大きさのストレージスペースを提供することです。文字列として使用可能なスペースは、各文字列の文字列値を格納するために使用されます。
新しい文字列が作成されるたびに、システムは新しい文字列と同じサイズのスペースをこのスペースから新しい文字列に分割します。
割り当てが成功すると、
操作を簡単にするために開始アドレスへのポインタが返されます。各文字列は、ストレージ構造の一部としても使用され
ます。動的割り当て関数ライブラリでmallocとfreeを使用して、ストレージスペースを管理します
。C++には、スペースを管理するためのnewとdeleteがあります。
#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include<string>
#include <cstdlib>
using namespace std;
#define STRMAXSIZE 256
#define OK 1;
#define ERROR 0;
typedef struct{
char *ch;
int length;
}SString;
typedef int Status;
//模拟一编从新开始
//用maloc和free 动态分配空间
Status IinitStr(SString &T)//初始化
{
T.ch = NULL;
T.length = 0;
return 0;
}
Status Assign(SString &T, char *chars)//将chars的内容赋予T
{
int len = strlen(chars);//
if (T.ch)
{
free(T.ch);
}
if (!len)
{
T.ch = NULL;
T.length = 0;
return 1;
}
else
{
T.ch = (char *)malloc(len * sizeof(char));//因为是动态分配所以要分配空间
for (int j = 0; j < len; j++)
{
T.ch[j] = chars[j];
}
T.length = len;
return 0;
}
return 0;
}
Status CopyStr(SString T, SString &S)//将S的内容赋予T 找出使用和不使用&的区别
{
S.ch = (char *)malloc(T.length * sizeof(char));//使得二者长度一致
for (int i = 0; i < T.length; i++)
{
S.ch[i] = T.ch[i];
}
S.length = T.length;
return 0;
}
Status Strprint(SString T)//打印出串
{
int i;
for (i = 0; i < T.length; i++)
cout << T.ch[i];
printf("\n");
return OK;
}
Status ComparStr(SString T, SString S)//判断二者是否相等,首先判断长度,再判断内容
{
int i,j;
j = 0;
if(T.length==S.length)
for (i = 0; i < T.length; i++)
{
if (T.ch[i] == S.ch[i])
j++;
else
break;
}
if (j == T.length)
cout << "相等" << endl;
else
cout << "不相等" << endl;
return 0;
}
//将二者按顺序串联成一个新串 在定义变量时,如果不对其初始化,则此变量包含一个垃圾值,即上次使用这块内存空间时遗留在此的值。
Status ConcatStr(SString &T, SString S, SString S1)//
{
int i;
//分配的空间为其总和
if (T.ch)
{
free(T.ch);
//return 0;
}
//分配空间
T.ch = ((char*)malloc((S.length+S1.length)*sizeof(char)));
if (!T.ch)
{
return 0;
//return 0;
}
for (i = 0; i < S.length; i++)
T.ch[i] = S.ch[i];
for (int j = 0; j < S1.length; j++)
T.ch[S.length + j] = S1.ch[j];
T.length = S.length + S1.length;
return 0;
}
//删除字符串中pos位置固定长度len的子串
Status DetelStr(SString T,int pos, int len)
{
int i;
int changdu=T.length;
if (changdu < len&&!T.ch[pos+len-1])//因为包括原本位置
{
return 0;
}
else
{
/*for (i = pos-1; i <= pos + len - 1; i++)
{
T.ch[i] = '\0';//这样只是替换成空格 我要的是前移
}*/
for (int j = 0; j <= changdu; j++)
{
T.ch[pos - 1 + j] = T.ch[pos + len + j];
}
for (int k = changdu - len + 1; k < changdu; k++)
{
T.ch[k] = '\0';
}
}
return 0;
}
//在某位置插入一个元素 原元素后移或前移 类似
//将某串中的子串换成另外一个子串,若不存在某子串则返回找不到该元素类似
Status main()
{
int i, k;
char C[STRMAXSIZE];
char C1[STRMAXSIZE];
SString S,S1;
IinitStr(S);//初始化
IinitStr(S1);
cout << "请输入字符串" << endl;
cin >> C >> C1;
cout << "将字符串赋予新串!" << endl;
Assign(S, C);//char 赋予值
Assign(S1, C1);
printf("新串生成成功!输出:\n");
Strprint(S);//打印
Strprint(S1);//打印
cout << "两个串比较" << endl;
ComparStr(S, S1);//相比较
cout << "将二者串联成一个新串" << endl;
SString SS;
IinitStr(SS);//定义了一个变量一定要给他赋值或初始化
ConcatStr(SS,S,S1);
Strprint(SS);
cout << "删去一段位置" << endl;
DetelStr(S, 2, 4);
Strprint(S);
return 0;
}
エンコード時に、文字列接続で新しい文字列が定義されましたが、初期化されなかったため、操作が失敗しました
。初期化の重要性を忘れないでください。!!
初期化します。