Implementación de cadena de estructura de almacenamiento de asignación de montón | C ++

El método de implementación de la cadena de estructura de almacenamiento de asignación de pila es proporcionar un espacio de almacenamiento suficientemente grande. El espacio disponible como cadena se utiliza para almacenar el valor de cadena de cada cadena.
Siempre que se crea una nueva cadena, el sistema divide un espacio con el mismo tamaño que la nueva cadena de este espacio para la nueva cadena.
Si la asignación es exitosa, devuelve un puntero a la dirección inicial
para facilitar la operación. La longitud de cada cadena también se usa como parte de la estructura de almacenamiento
usa malloc y gratis en la biblioteca de función de asignación dinámica para administrar el espacio de almacenamiento.
C ++ tiene new y delete para administrar el espacio.

#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;
}


Al codificar, en la conexión de cadena, se definió una nueva cadena, pero no se inicializó, por lo que la operación no tuvo éxito, ¡
así que recuerde la importancia de la inicialización! ! !
Inicializar .

Supongo que te gusta

Origin blog.csdn.net/weixin_46096297/article/details/109785844
Recomendado
Clasificación